Está en la página 1de 3

Funciones virtuales

Una función virtual es una función miembro que se espera volver a definir en clases derivadas.
Cuando se hace referencia a un objeto de clase derivada mediante un puntero o una referencia a la
clase base, se puede llamar a una función virtual para que ese objeto y ejecutar la versión de la
clase derivada en función.

Las funciones virtuales garantizan que se llame a la función correcta para un objeto, con
independencia de la expresión utilizada para llamarla.

Suponga que una clase base contiene una función declarada como virtual y una clase derivada
define la misma función. La función de la clase derivada se invoca para los objetos de la clase
derivada, aunque se llame mediante un puntero o una referencia a la clase base.

Ejemplo: clase base que proporciona una implementación de la función PrintBalance y dos clases
derivadas.

En este código las llamadas PrintBalance son iguales, excepto por el objeto al que apunta
pAccount. Dado que PrintBalance es virtual, se llama a la versión de la función definida para cada
objeto. La función PrintBalance de las clases derivadas CheckingAccount y SavingsAccount
“reemplaza” la función en la base Account.

Las funciones de clases derivadas reemplazan funciones virtuales de clases base solo si son del
mismo tipo. Una función de una clase derivada no puede diferir de una función virtual de una clase
base solo en su tipo de valor devuelto; la lista de argumentos tambien debe ser diferente.

Al llamar a una función mediante punteros o referencias, se aplican las siguientes reglas:

 Una llamada a una función virtual se resuelve de acuerdo con el tipo subyacente del objeto
para el que se llama.
 Una llamada a una función no virtual se resuelve de acuerdo con el tipo de puntero o
referencia.

Ejemplo: Como se comportan las funciones virtuales y no virtuales cuando se llaman mediante
punteros.
Independientemente que la función Nameof se invoca a través de un puntero a base o un puntero
a Derived, llama la función para Derived. Llama a la función para Derived porque Nameof es una
función virtual y tanto pBase como pDerived apuntan a un objeto de tipo Derived.

Dado que solo se llama a funciones virtuales para objetos de tipos clase , no se puede declarar
funciones globales o estáticas como virtual.

La palabra clave virtual se puede usar para declarar funciones de remplazo en una clase derivada;
los remplazos de funciones de virtuales siempre son virtuales

Las funciones virtuales de una clase se deben definir a menos que se declaren mediante pure-
specifier.

También podría gustarte