2009-01-07 14 views
43

¿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; 
+1

Han un [leer de esta] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class#21607) (que se ha pedido antes de). –

Respuesta

38

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 
+10

'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. –

+3

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