Wie löst die virtuelle Vererbung die Mehrdeutigkeit des „Diamanten“ (Mehrfachvererbung)?
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 Diamond-Problem, und der obige Code hat dieses Problem nicht.
Wie genau löst die virtuelle Vererbung das Problem?
Was ich verstehe Wenn ich sageA *a = new D();
, der Compiler möchte wissen, ob ein Objekt vom TypD
kann einem Zeiger vom Typ @ zugewiesen werdA
, aber es gibt zwei Wege, denen es folgen kann, die es jedoch nicht selbst bestimmen kann.
Wie behebt die virtuelle Vererbung das Problem (hilft dem Compiler, die Entscheidung zu treffen)?