«импортировать» определение функции из базового класса для реализации абстрактного интерфейса (множественное наследование в C ++) - PullRequest
3 голосов
/ 20 июля 2010

Скажем, у нас есть класс, наследующий от двух базовых классов (множественное наследование). База class A является абстрактной, объявляя чисто виртуальную функцию foo, другая база class B объявляет и реализует функцию foo той же сигнатуры.

struct A
{
  virtual void foo(int i) = 0;
};

struct B
{
  virtual void foo(int i) {}
};

struct C : public A, public B {};

Я хочу использовать реализацию foo из базы class B в моем производном class C. Однако, если я не реализую функцию foo во второй раз в своем производном class C, я не смогу создать экземпляр этого объекта (он остается абстрактным). Виртуальное наследование здесь не помогает, как и ожидалось (class A и class B не имеют общего базового класса).

Интересно, есть ли способ "импортировать" реализацию foo из class B в class C, чтобы не повторять один и тот же код.

Приведенный выше пример, конечно, надуман. Причина, по которой я хочу реализовать foo в class B, заключается в том, что я хочу получить class D : public B и использовать class B s реализацию foo. Я знаю, что наследование (в первую очередь) не предназначено для повторного использования кода, но я все же хотел бы использовать его таким образом.

1 Ответ

2 голосов
/ 20 июля 2010

В Java ваш пример кода работает.В C ++ это не так.Небольшая разница между этими языками.

Лучшим вариантом в C ++ является определение C :: foo () путем пересылки в B :: foo ():

struct C : public A, public B
{
  virtual void foo(int i) { B::foo(i); }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...