У меня следующая ситуация, на картинке показан теоретический граф наследования моих классов:
Основная идея состоит в том, чтобы
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 ++?
РЕДАКТИРОВАТЬ: Перевернутые стрелки на диаграмме и исправление "понижающего преобразования" на "повышающего преобразования".