| 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ónconvencional se ganaría en eficiencia:
 |  | 
         
          |  |  |  |  |  |  |  |  | 
         
          |  |  |  |  | Clase_1 
              Objeto_1; // Se definen un objeto de una claseClase_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.
 |  | 
         
          |  |  |  |  |  |  |  |  |