Tema
20
Funciones
Virtuales y Polimorfismo
|
|
|
|
|
|
|
|
|
|
|
Teoría:
Implementación de las Funciones Virtuales
|
|
|
|
|
|
|
|
|
|
|
|
Una
función virtual puede ser llamada como una
función convencional, es decir, utilizando vinculación
estática. En este caso no se están aprovechando
las características de las funciones virtuales,
pero el programa puede funcionar correctamente. A continuación
se presenta un ejemplo de este tipo de implementación que
no es recomendable usar, ya que utilizando una función
convencional se ganaría en eficiencia:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Clase_1
Objeto_1; // Se definen un objeto de una clase
Clase_1 *Puntero_1; // y un puntero que puede apuntarlo
float variable;
Puntero_1
= &Objeto_1;
variable = Objeto_1.Funcion_1( ); // Utilización de vinculación
estática
variable = Puntero_1->Funcion_1( ); // con funciones virtuales.
Absurdo
|
|
|
|
|
|
|
|
|
|
|
|
|
En
el ejemplo anterior en las dos asignaciones a variable, las funciones
que se van a utilizar se determinan en tiempo de compilación.
A
continuación se presenta un ejemplo de utilización
correcta de las funciones virtuales:
|
|
|
|
|
|
|
|
|
|
|
|
|
Clase_Base
Objeto_Base;
Clase_Derivada Objeto_Derivado;
Clase_Base *Puntero_Base_1;
Clase_Base *Puntero_Base_2;
float variable;
Puntero_Base_1 = &Objeto_Base; // El puntero a la clase base
puede
// apuntar a un objeto de la clase base
Puntero_Base_2 = &Objeto_Derivado; // o a un objeto de la clase
derivada
variable = Puntero_Base_2->Funcion_1( ); // Utilización
correcta
// de una función virtual
|
|
|
|
|
|
|
|
|
|
|
|
|
En
este nuevo ejemplo se utiliza vinculación dinámica,
ya que el Puntero_Base_2 puede apuntar a un objeto
de la clase base o a un objeto de cualquiera de las
clases derivadas en el momento de la asignación a
variable, en la última línea del ejemplo.
Por eso, es necesariamente en tiempo de ejecución cuando
el programa decide cuál es la Funcion_1 concreta
que tiene que utilizar.
Esa Funcion_1 será la definida para la clase
del Objeto_Derivado si está definida, o la
de la clase base más próxima en el orden
jerárquico que tenga definida esa Funcion_1.
|
|
|
|
|
|
|
|
|
|