¿Qué es la herencia virtual?
La herencia virtual es un tipo de herencia en el que la implementación de una superclase está incompleta y se requiere una subclase para la definición completa de un objeto. Este tipo de herencia se puede usar junto con la herencia única y múltiple, pero se usa más comúnmente en la herencia múltiple. Cualquier clase que hereda de una clase base virtual se convierta en una subclase directa de esa clase base. Una clase base virtual puede depender de una subclase para implementar todos sus métodos, pero esto no es un requisito.
C ++ es el lenguaje informático más comúnmente conocido para usar la herencia virtual. Para declarar la herencia virtual en C ++, se usa la palabra clave "virtual". Tanto la superclase como la subclase deben declarar métodos virtuales con la palabra clave "virtual". Esto le dice al compilador C ++ que la superclase está incompleta, y debe obtener información de la subclase para completarla. Usar la subclase para completar la superclase no significa que las subclases se sobrescriban si tienen elLa misma clase base, y en su lugar, el compilador C ++ se encarga de determinar qué piezas van con cada objeto.
Dado que se requiere una clase base virtual para la herencia virtual, las funciones globales en C ++ no pueden declararse virtuales. Este tipo de herencia solo se puede usar al adherirse a los principios de programación orientados a objetos (OOP). La razón de esto es que las funciones globales no están asociadas con una clase en particular, por lo que generalmente son autónomos solos. Sin una herencia de superclase y subclase no puede ocurrir, por lo que las funciones globales y la herencia virtual son mutuamente excluyentes. Las funciones globales pueden, en teoría, usarse dentro de las funciones virtuales, pero lo contrario puede no siempre funcionar.
La herencia virtual se utiliza para resolver muchos problemas de programación, y uno de los más útiles es la resolución de la ambigüedad. En la herencia múltiple, uno puede tener una clase base A que tiene dos subclases, B yC, y luego una clase D que hereda de ambas clases B y C. Este patrón se llama comúnmente el "diamante de la muerte" porque si las clases A, B y C tienen implementaciones del mismo método, no es posible que la Clase D determine qué implementación debe usar. La herencia virtual resuelve este problema porque la implementación de cada clase sigue siendo distinta y, por lo tanto, inequívoca. Esta distinción es manejada por objetos internos especializados llamados tablas virtuales (VTables) que realizan un seguimiento de cada tipo de objeto, pero estas tablas no necesitan ser manipuladas explícitamente por un programador porque están integradas en el idioma.
.