Как виртуальное наследование решает неопределенность «алмазного» (множественного наследования)?
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
, но у него есть два пути, по которым он может следовать, но не может решить сам по себе.
Итак, как виртуальное наследование решает проблему (помогает компилятору принять решение)?