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 la parte de arriba del código no tiene ese problema.¿Cómo soluciona la herencia virtual la ambigüedad de "diamante" (herencia múltiple)?
¿Cómo soluciona exactamente la herencia virtual el problema?
lo que entiendo: Cuando digo A *a = new D();
, el compilador quiere saber si un objeto de tipo D
se puede asignar a un puntero de tipo A
, pero tiene dos caminos que puede seguir, pero no puede decidir por sí mismo.
Entonces, ¿cómo la herencia virtual resuelve el problema (el compilador de ayuda toma la decisión)?
puntero Vtable es un detalle de implementación. No todos los compiladores introducirán punteros vtable en este caso. – curiousguy
Creo que se vería mejor si los gráficos se reflejaran verticalmente. En la mayoría de los casos he encontrado tales diagramas de herencia para mostrar las clases derivadas debajo de las bases. (Consulte "downcast", "upcast") – peterh