BUSCAR
INDICE
INDICE DEL TEMA
OBJETIVOS
TEORIA
PALABRAS RESERVADAS
GLOSARIO
EJERCICIOS
RESUELTOS
AUTOEVALUACION
PROPUESTOS
ERRORES
ESTADISTICAS
INICIO
FAQS
LINKS
RECOMIENDANOS
QUIENES SOMOS
MAPA DEL WEB
COLABORAR
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.