3.6 Funciones Virtuales

 Cuando usamos el mismo nombre de función en las clases base y derivadas, la función de la clase base es declarada como virtual usando la palabra reservada virtual. C++ determina la función a utilizar en tiempo de ejecución, basándose en el tipo de objeto apuntado por el puntero base, en lugar del tipo de puntero. Así, al hacer que el puntero base apunte a objetos diferentes, podemos ejecutar diferentes versiones de la función virtual.

Un punto importante a recordar consiste en que necesitamos acceder a las funciones virtuales mediante el uso de un puntero declarado como puntero a la clase base ¿Por qué no podemos usar el nombre del objeto como con cualquier otra función miembro para llamar a las funciones virtuales? Podemos, pero recordemos que el polimorfismo en tiempo de ejecución solo se consigue cuando se accede a una función virtual mediante un puntero a la clase base.


Reglas para las funciones virtuales

1. Las funciones virtuales tiene que ser miembros de una clase.
2. No pueden ser miembros estáticos.
3. Se accede a ellas usando punteros a objetos.
4. Una función virtual puede ser afín a otra clase.
5. Una función virtual tiene que ser definida en una clase base, aunque no se use en la misma.
6. Los prototipos de la versión de la clase base de una función virtual y todas las versiones de las clases derivadas tienen que ser iguales. Si dos funciones con el mismo nombre tienen prototipos diferentes, C++ las considera como funciones sobrecargadas, ignorando el mecanismo de las funciones virtuales.
7. No se puede tener constructores virtuales pero si podemos tener destructores virtuales
8. Aunque un puntero base puede apuntar a cualquier tipo de objeto derivado, lo inverso no es cierto. Es decir, no podemos usar un puntero a una clase derivada para acceder a un objeto del tipo base.
9. Cuando un puntero base apunta a una clase derivada, al incremento o decrementarlo no apuntará al siguiente objeto de la clase derivada. Es incrementado o decrementado en relación con su tipo de base. Por tanto, no debemos usar este método para desplazar el puntero al objeto siguiente.
10. Si se define una función virtual en la clase base, no necesita ser redefinida obligatoriamente en la clase derivada. En estos casos, las llamadas invocaran a la función base.