ho la seguente situazione, illustrato è il grafico eredità teorica delle mie classi:eredità Interface-come in C++
L'idea è sostanzialmente quella
1) presentano due classi base astratte che può essere implementato su piattaforme diverse (nel mio caso due sistemi operativi diversi)
2) consentire a BBase di essere sovraimposto a ABase per essere in grado di gestire entrambi allo stesso modo a volte (ad esempio per contenere istanze di entrambi i tipi in una lista).
3) implementare alcune funzionalità comuni in ABase e BBase.
Ora, quale sarebbe il modo migliore per rappresentare questo in C++? Anche se supporta l'ereditarietà multipla, l'ereditarietà multi-livello come questa non è possibile a mia conoscenza. Il problema è che B eredita da A e BBase, che a loro volta ereditano da ABase. Basta tradurre questa 1: 1 (codice seguente) in C++, un compilatore C++ (GNU) si lamentano del fatto che abase :: foo() non è implementata in 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;
}
Come cambieresti questo modello di ereditarietà per rendere è compatibile con C++?
MODIFICA: Frecce invertite nel diagramma e corretto "calcinabile" a "sommabile".
"BBase da essere declassato ad ABase" intendi come up-castable, giusto? –
Sì, grazie per il suggerimento. Lo stesso vale per le frecce nel diagramma. – Johannes