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)?

questionAnswers(7)

yourAnswerToTheQuestion