2015-06-02 2 views
3

Скажем, у меня есть интерфейс, который наследуется от другого интерфейса (чисто абстрактный класс)Заполнение абстрактных членов класса, выводя из бетона класса

class BaseInterface 
{}; 

Затем другой интерфейс основывается на BaseInterface

class ExtendedInterface : public BaseInterface 
{}; 

сейчас , У меня есть конкретный класс, который реализует BaseInterface:

class Base : public BaseInterface 
{}; 

Теперь, я хочу для реализации ExtendedInterface, но поскольку у меня уже есть Base, я хочу заполнить элементы BaseInterface базой. Например:

class Extended : public ExtendedInterface, public Base 
{}; 

Это не работает. Я получаю жалобы, что я не могу создать экземпляр, поскольку он является абстрактным классом. Единственный способ заставить его работать - это использовать виртуальное наследование, но затем я получаю предупреждения о наследовании с помощью доминирования.

ответ

3

В чем проблема?

С вашим множественным наследованием Extended наследует два раза от BaseInterface. Это означает, что есть два независимых BaseInterface подобъектов:

  • один наследуется через бетонный Base класса, который переопределен все чистые виртуальные функции.

  • , а другой наследуется через класс ExtendedInterface, который до сих пор является абстрактным.

enter image description here

В результате, так как некоторые Подобъекты Extended все еще имеют чистые виртуальные функции, ваш класс по-прежнему является абстрактным классом, который не может быть реализован.

Как это решить?

Как, несмотря на множественное наследование вы, видимо, ожидать, чтобы иметь только один BaseInterface, вам нужно использовать виртуальное наследование:

class BaseInterface          
{ virtual void test()=0; };        // abstract class 

class ExtendedInterface : public virtual BaseInterface // virtual inheritance 
{};              // abstract class 

class Base : public virtual BaseInterface    // virtual inheritance 
{ void test() override {} };        // concrete class 

class Extended : public ExtendedInterface, public Base // multiple 
{};        // thanks to virtual inheritance, concerete class 

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

Здесь online demo