Наследование, подобное интерфейсу в C ++

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

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 ++?

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

6
задан Johannes 8 January 2011 в 16:41
поделиться