El polimorfismo de tiempo de ejecución en c ++ se logra con funciones virtuales . Para implementar funciones virtuales, C ++ usa una tabla virtual . El compilador lo hace insertando una tabla virtual para cada clase que tiene una función virtual o para una clase que hereda otra clase que tiene una función virtual.
Entonces, ¿qué contiene una tabla virtual? . En palabras simples, la tabla virtual para una clase es una matriz estática que contiene una entrada para cada función virtual que pueden llamar los objetos de esa clase.
Consideremos un ejemplo aquí:
- Dada una matriz, ¿qué es un algoritmo para identificar la submatriz con la suma máxima?
- ¿Por qué es tan difícil encontrar documentaciones útiles y completas sobre métodos criptográficos en Internet?
- ¿Cuáles son todas las aplicaciones conocidas de las técnicas de optimización de colonias de hormigas?
- ¿Dónde puedo encontrar un tutorial simplificado para Atkin's Sieve?
- ¿Por qué una función está tan definida?
#include
usando el espacio de nombres estándar;
Avión de clase {
público:
GetName virtual vacío () {
cout << "Nombre del avión" << endl;
}
virtual GetType vacío () {
cout << "Tipo de avión" << endl;
}
};
class FighterPlane: Public Airplane {
público:
nulo GetType () {
cout << "Avión de combate" << endl;
}
};
principal(){
Avión a;
a.GetName ();
a.GetType ();
FighterPlane f;
f.GetType ();
f.GetName ();
}
Aquí, hay dos clases: avión y avión de combate. Como la clase Airplane contiene funciones virtuales, el compilador crea una tabla virtual para esa clase y para la clase FighterPlane, ya que hereda una clase que contiene una función virtual.
Se crea un puntero en tiempo de compilación que contiene la dirección de la tabla virtual para cada clase. En el caso de la clase Airplane, la tabla virtual contiene un puntero a las funciones GetName () y GetType ().
entonces la tabla virtual para la clase de Avión puede verse de la siguiente manera:
Avión * a = nuevo Avión ();
a -> GetName ();
a -> GetType ();
Ahora, en el caso de la clase FighterPlane, como esta clase hereda la clase Airplane, también hereda * a. Pero se crea una nueva tabla virtual para esta clase en tiempo de compilación. La clase FighterPlane no tiene implementación para GetName (), pero hereda * a. Entonces, la tabla virtual para la clase FighterPlane puede verse así:
Avión * a = nuevo FighterPlane ();
a -> GetName (); // llama a Airplane GetName ()
a -> GetType (); // llama a FighterPlane GetType ()
Básicamente, podemos decir que la tabla virtual es una matriz de punteros de función que apuntan a funciones virtuales.
Espero eso ayude
Gracias
Referencia: 12.5 – La mesa virtual