3

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

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. Я знаю, что наследование не (в первую очередь) предназначено для повторного использования кода, но я все равно хотел бы использовать его таким образом.

ответ

2

В java ваш образец кода работает. В C++ это не так. Тонкая разница между этими языками.

Ваш лучший вариант в C++ является определение C :: Foo() путем переадресации B :: Foo():

struct C : public A, public B 
{ 
    virtual void foo(int i) { B::foo(i); } 
}; 
+0

Это звучит как жизнеспособный вариант, по крайней мере, спасибо! – kynan

 Смежные вопросы

  • Нет связанных вопросов^_^