Punteros a clases derivadas

En C++ el polimorfismo se admite tanto en el momento de la compilación, como en el de la ejecución. La sobrecarga de operadores y funciones es un ejemplo de polimorfismo en el momento de la compilación. Para conseguir el polimorfismo en el momento de la ejecución C++ permite usar clases derivadas y funciones virtuales.

 

En C++ los punteros a clases base y a clases derivadas están relacionados. Mediante un puntero de una clase base es posible acceder a una clase derivada, aunque no es posible a la inversa. Por ejemplo:

 

clase_B *p; clase_B tipo base

clase_B B_ob; clase_D derivado de clase_B

clase_D D_ob;

 

p=&B_ob; // p apunta a un objeto del tipo clase_B

p=&D_ob; // p apunta a un objeto del tipo clase_D

 

Usando p, se puede acceder a todos los elementos de D_ob heredados de B_ob. Sin embargo, los elementos específicos de la D_ob no pueden ser referenciados usando p, a menos que se utilice una refundición de tipos.

 

class X {

protected:

char nombre[30];

public:

void mostrar (void);

void nombrar (char *nom);

};

 

 

 

 

 

 

class Y : public X {

int edad;

public:

void mostrarY (void);

void poneredad (int ed);

};

 

main ( )

{

X x;

Y y;

X *px;

Y *py;

((Y *) px)-> poneredad (16) // Accedemos a los no miembros de X

((Y *) px)-> mostrarY ( ) // refundiendo el tipo del puntero