Funciones virtuales

 

Una función virtual es una función que se declara en la clase base como virtual y se redefine en una o más clases derivadas.

Las funciones virtuales son especiales, porque cuando se accede a una usando un puntero de la clase base a un objeto de una clase derivada, C++ determinada en tiempo de ejecución a que función llamar en función del tipo de objeto apuntado.

Una función virtual se declara como virtual dentro de la clase base usando la palabra clave virtual. Sin embargo, cuando se redefine una función virtual en una clase derivada no se necesita repetir la palabar clave virtual (aunque no es un error hacerlo).

 

class Base {

public:

virtual void quien ( ) { cout << "Base\n"; };

};

 

class primera_d : public Base {

public:

void quien ( ) { cout << "Primera derivación\n"; };

};

 

class segunda_d : public Base {

};

 

main ( )

{

Base obj_base;

Base * p;

primera_d obj_primera;

segunda_d obj_segunda;

p=&obj_base;

p->quien ( ); // Se accede al quien de Base

p=&obj_primera;

p->quien ( ); // Se accede al quien de primera

p=&obj_segunda;

p->quien ( ); // Se accede al quien de base

}

 

Funciones virtuales puras y tipos abstractos

Una función virtual pura es una función que se declara en una clase base y que no tiene definición relativa a la base, por lo que todos los tipos derivados se ven obligados a definir su propia versión de esa función.

 

Para declarar una función virtual pura se utiliza la forma general:

 

virtual tipo nombre_funcion (lista parametros) = 0;

 

Si una clase tiene por lo menos una función virtual pura, entonces se dice que esa clase es abstracta. Las clases abstractas tienen una característica importante: no puede haber objetos de esa clase, porque una o más de sus funciones carecen de definición. Es posible declarar punteros de una clase abstracta.

 

class figura {

protected:

double x,y;

public:

void pon_dim (double i, double j) { x=i ; y=j; };

virtual void mostrar_area ( ) = 0;

};

   

class triangulo : public figura {

public:

void mostrar_area ( )

{

cout << "Triangulo de altura" << x << " y base" << y;

};

};

 

class cuadrado : public figura {

public:

void mostrar_area ( )

{

cout << "Cuadrado de dimensión << x << "," << y;

};

};

 

main ( )

{

figura *p;

triangulo trian;

cuadrado cuad;

p=&trian;

p->pon_dim (10.0, 5.0);

p->mostrar_area ( );

p=&cuad;

p->pon_dim (10.0, 5.0);

p->mostrar_area ( );

}