Como a herança virtual resolve a ambiguidade do "diamante" (herança múltipla)?
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();
}
Eu entendo o problema do diamante e o código acima não tem esse problema.
Como exatamente a herança virtual resolve o problema?
O que eu entendo: Quando eu digoA *a = new D();
, o compilador deseja saber se um objeto do tipoD
pode ser atribuído a um ponteiro do tipoA
, mas tem dois caminhos que pode seguir, mas não pode decidir por si só.
Então, como a herança virtual resolve o problema (ajude o compilador a tomar a decisão)?