¿Cuál es el significado de herencia "virtual"?virtual inheritance
vi el siguiente código, y no entendía el significado de la palabra clave virtual
en el siguiente contexto:
class A {};
class B : public virtual A;
¿Cuál es el significado de herencia "virtual"?virtual inheritance
vi el siguiente código, y no entendía el significado de la palabra clave virtual
en el siguiente contexto:
class A {};
class B : public virtual A;
herencia virtual se utiliza para resolver el problema DDD (terrible diamante en derivación).
Mira el siguiente ejemplo, donde hay dos clases que heredan de la misma clase base:
class Base
{
public:
virtual void Ambig();
};
class C : public Base
{
public:
//...
};
class D : public Base
{
public:
//...
};
Ahora, que desea crear una nueva clase que hereda tanto de clases C y D (que ambos han heredado la función Base :: Ambig()):
class Wrong : public C, public D
{
public:
...
};
Mientras se define la clase "incorrecto" por encima, en realidad se creó el DDD (Diamond problema Derivación), porque no se puede llamar:
Wrong wrong;
wrong.Ambig();
Esta es una función ambigua porque se define en dos ocasiones:
Wrong::C::Base::Ambig()
Y:
Wrong::D::Base::Ambig()
con el fin de evitar este tipo de problema, se debe utilizar la herencia virtual, que sabrá hacer referencia a la ri ght Ambig()
función.
Por lo tanto - Definir:
class C : public virtual Base
class D : public virtual Base
class Right : public C, public D
'Wrong' podría ser' Correcto'. Depende de la situación. El IM normal y el MI virtual tienen su lugar, incluso en la presencia de patrones de diamante (no terribles) que surgen. Solo recuerda que no hay un tamaño que se ajuste a todos. –
Creo que llama la atención sobre lo que está mal, con sus clases "Incorrecta" y "Correcta". Son idénticos por una razón: no son el problema. Si bien tiene la herencia virtual para los padres C y D, básicamente pasa por alto: C y D fueron los que estaban "equivocados" y deben corregirse, no la clase que deriva de ambos. – Kevin
Han un [leer de esta] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class#21607) (que se ha pedido antes de). –