La herencia virtual solo es relevante si las clases deben heredar de Foo
.Si se defina lo siguiente:
class B {};
class L : virtual public B {};
class R : virtual public B {};
class D : public L, public R {};
A continuación, el objeto final únicamente incluya una copia de B
, compartida por ambos L
y R
. Sin el virtual
, un objeto de tipo D
contendría dos copias de B
, una en L
, y una en R
.
Existe un argumento de que toda la herencia debe ser virtual (porque en los casos en que hace una diferencia, eso es lo que desea más de el tiempo). En la práctica, sin embargo, la herencia virtual es costosa, y en la mayoría de los casos, no es necesario: en un sistema bien diseñado, la mayoría de las herencia será simplemente de una clase concreta heredando de uno o más "interfaces"; tal clase concreta generalmente no está diseñada para ser derivada de sí misma, por lo que no hay problema. Pero existen excepciones importantes : si, por ejemplo, define una interfaz, y luego extensiones a la interfaz, las extensiones deberían heredar virtualmente desde la interfaz base, ya que una implementación concreta podría querer implementar varias extensiones. O si está diseñando mixins, donde ciertas clases solo implementan parte de la interfaz, y la clase final hereda de varias de estas clases (una por parte de la interfaz ). Al final, el criteron en cuanto a si herede prácticamente o no, no es demasiado difícil:
si la herencia no es pública, es probable que no debe ser virtual (nunca he visto una excepción), de lo contrario
Si la clase no está diseñado para ser una clase base, no hay necesidad de herencia virtual, de lo contrario
la herencia debe ser virtual.
Hay algunas excepciones, pero las reglas anteriores a errar por el lado de seguridad; por lo general, es "correcto" heredar prácticamente incluso en los casos en que la herencia virtual no es necesaria.
Un punto final: una base virtual siempre debe ser inicializado por la clase más derivada, no la clase que hereda directamente (y declara que la herencia es virtual). En la práctica, sin embargo, esto no es un problema. Si observa los casos en los que la herencia virtual tiene sentido, es siempre un caso de herencia de una interfaz, que no contendrá datos , y por lo tanto tendrá (solo) un constructor predeterminado. Si te encuentras heredando virtualmente de clases con constructores que toman argumentos , es hora de hacer algunas preguntas serias sobre el diseño.
No voy a responder porque el tema no merece realmente un tratamiento tan superficial: pero sin 'virtual' cada clase que hereda de' Bar' tendrá su propia copia de 'Bar', con' virtual' la clase más derivada tendrá solo una copia de 'Bar'. –
Probar: [esta búsqueda] (http://stackoverflow.com/search?q = virtual + inheritance +% 5Bc% 2B% 2B% 5D) –
posible duplicado de [¿En la clase base virtual de C++?] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class) –