/ / Наслідування, подібне до інтерфейсу C ++ - c ++, успадкування, gcc, g ++, абстрактний клас

Інтерфейсне спадкування в C ++ -c ++, успадкування, gcc, g ++, абстрактний клас

Я маю таку ситуацію, на зображенні - теоретичний графік успадкування моїх класів:

Графік спадкування

Ідея полягає в тому, щоб

1) мають два абстрактних базових класу, які можуть бути реалізовані на різних платформах (у моєму випадку дві різні операційні системи)

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

3) реалізують певні загальні функціональні можливості в ABase і BBase.

Тепер, який би був найкращий спосіб представити цев C ++? Навіть незважаючи на те, що він підтримує багаторазове успадкування, багаторівневе успадкування не є можливим. Проблема полягає в тому, що B успадковується від A і BBase, які обидва в свою чергу успадковуються від ABase. Просто переводячи цей код у 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 ++?

EDIT: Перевернуті стрілки в діаграмі і скориговані "вниз-литтям" до "перегортання".

Відповіді:

7 для відповіді № 1

Ви можете безпосередньо використовувати цей тип ієрархії в 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 {...};