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(); 
} 
Я понимаю проблему с алмазом, и над куском кода этой проблемы нет.
Как именно виртуальное наследование решает проблему?
  Что я понимаю:
Когда я говорю A *a = new D();, компилятор хочет знать, может ли объект типа D присваиваться указателю типа A, но он имеет два пути, которым он может следовать, но не может решить сам по себе.
Итак, как виртуальное наследование разрешает проблему (помогите компилятору принять решение)?