Перегрузка методов при наследовании в C ++ - PullRequest
7 голосов
/ 29 мая 2011

У меня есть устаревший код:

struct Iface1
{
  virtual ~Iface1() {}
  virtual void foo(const int arg1) const = 0;
};

struct Iface2
{
  virtual ~Iface2() {}
  virtual void foo(const int arg1, const int arg2) const = 0;
};

/// Composite interface
struct Iface12 : Iface1, Iface2
{
};

Мне нужно создать декоратор для составного интерфейса.Следующий код даже не скомпилирован, поскольку G ++ и MSVC «неоднозначно» определяют, какой тип foo () вызывается.Может ли кто-нибудь указать мне, как заставить код ниже скомпилировать и работать?(к сожалению, у меня нет времени на рефакторинг).

И я даже не понимаю, почему компилятор не может определить, какую функцию вызывать, поскольку все сигнатуры функций явные.Спасибо.

struct IfaceDecorator : Iface12
{
  IfaceDecorator(Iface12& iface) : impl(iface) {}

  virtual void foo(const int arg1) const
  {
    impl.foo(arg1);
  }

 virtual void foo(const int arg1, const int arg2) const
 {
   impl.foo(arg1, arg2);
 }

private:
  Iface12& impl;
};

Ответы [ 2 ]

6 голосов
/ 29 мая 2011

Вам необходимо явно импортировать foo в класс Iface12, поэтому вы получите две перегруженные функции Iface12::foo.

struct Iface12 : Iface1, Iface2
{
  using Iface1::foo;
  using Iface2::foo;
};

Функции-члены с одинаковыми именами перегружают друг друга только тогда, когдаони объявлены в том же классе, если вы хотите перегрузить унаследованную функцию, вам нужно импортировать имя в текущий класс через using ParentClass::functionName.Я думаю, что это принцип наименьшего удивления - ваша функция члена не будет перегружена, если вы не попросите об этом.

2 голосов
/ 29 мая 2011

Если проблема заключается в сообщении «impl», вы можете исправить это с помощью:

impl.Iface1::foo( arg1 );
// ...
impl.Iface2::foo( arg1, arg2 );

... и т. Д.

РЕДАКТИРОВАНИЕ:неопределенность закончилась.

...