Интерфейсное наследование в C ++ - PullRequest
6 голосов
/ 08 января 2011

У меня следующая ситуация, на графике представлен график теоретического наследования моих классов:

Inheritance Graph

Идея в основном

1) имеет два абстрактных базовых класса, которые могут быть реализованы на разных платформах (в моем случае две разные операционные системы)

2) позволяют BBase быть прекалибруемым до ABase, чтобы иметь возможность обрабатывать оба одинаково время от времени (например, чтобы хранить экземпляры обоих типов в одном списке).

3) реализовать некоторые общие функции в ABase и BBase.

Теперь, что было бы лучшим способом представить это в C ++? Даже несмотря на то, что он поддерживает множественное наследование, многоуровневое наследование, как это, насколько я знаю, невозможно. Проблема в том, что B наследуется от A и BBase, которые в свою очередь наследуются от ABase. Просто переведя это 1: 1 (следующий код) в C ++, компилятор C ++ (GNU) пожалуется, что ABase :: foo () не реализован в B.

class ABase
{
public:
    virtual void foo() = 0;
    void someImplementedMethod() {}
};

class BBase : public ABase
{
public:
    virtual void bar() = 0;
    void someOtherImplementedMethod() {}
};

class A : public ABase
{
public:
    A() {}
    void foo() {}
};

class B : public A, public BBase
{
public:
    B() : A() {}
    void bar() {}
};

int main()
{
    B b;
    return 0;
}

Как бы вы изменили эту модель наследования, чтобы сделать ее совместимой с C ++?

РЕДАКТИРОВАТЬ: Перевернутые стрелки на диаграмме и скорректированы "с понижением частоты" до "с повышением частоты".

1 Ответ

7 голосов
/ 08 января 2011

Вы можете напрямую использовать этот тип иерархии в C ++, используя виртуальное наследование :

class ABase{...};
class BBase : public virtual ABase {...};
class A     : public virtual ABase {...};
class B     : public A, public BBase {...};

Конечно, если вы планируете иметь больше уровней, было бы неплохо использовать виртуальное наследование для B, поэтому вы получите

class B     : public virtual A, public virtual BBase {...};
...