class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main(){
A *a = new D();
a->eat();
}
Ich verstehe das Diamantproblem, und über Stück Code hat dieses Problem nicht.Wie löst virtuelle Vererbung die Mehrdeutigkeit "Diamant" (Mehrfachvererbung)?
Wie genau löst die virtuelle Vererbung das Problem?
Was ich verstehe: Als ich A *a = new D();
sagen, der Compiler, wenn ein Objekt vom Typ wissen will D
kann auf einen Zeiger vom Typ A
zugeordnet werden, aber es hat zwei Wege, die ihm folgen kann, aber kann sich nicht entscheiden von selbst.
Also, wie löst virtuelle Vererbung das Problem (Hilfe Compiler die Entscheidung treffen)?
Vtable Zeiger ist ein Implementierungsdetail. Nicht alle Compiler werden in diesem Fall vtable-Zeiger einführen. – curiousguy
Ich denke, es würde besser aussehen, wenn die Graphen vertikal gespiegelt werden würden. In den meisten Fällen habe ich solche Vererbungsdiagramme gefunden, um die abgeleiteten Klassen unterhalb der Basen zu zeigen. (siehe "downcast", "upcast") – peterh