¿Cómo resuelve la herencia virtual la ambigüedad del "diamante" (herencia múltiple)?

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(); 
} 

Entiendo el problema del diamante, y el código anterior no tiene ese problema.

¿Cómo exactamente la herencia virtual resuelve el problema?

Lo que yo entiendo: Cuando yo digoA *a = new D();, el compilador quiere saber si un objeto de tipoD se puede asignar a un puntero de tipoA, pero tiene dos caminos que puede seguir, pero no puede decidir por sí mismo.

Entonces, ¿cómo resuelve el problema la herencia virtual (el compilador de ayuda toma la decisión)?

Respuestas a la pregunta(7)

Su respuesta a la pregunta