Как виртуальное наследование решает неопределенность «алмазного» (множественного наследования)?

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, но у него есть два пути, по которым он может следовать, но не может решить сам по себе.

Итак, как виртуальное наследование решает проблему (помогает компилятору принять решение)?

Ответы на вопрос(7)

Ваш ответ на вопрос