8.4.- Poliformismo


Las funciones miembro son las que determinan el comportamiento de un objeto. Esto conlleva la idea de que, si queremos que un objeto se comporte de manera diferente, primero habrá que modificar la clase o "molde", agregándole la función miembro que determina el comportamiento deseado, para, posteriormente, crear un objeto de la clase modificada.

En los ejemplos mostrados hasta aquí, todos los objetos tienen la habilidad necesaria para mostrarse en la pantalla. Sin embargo, cada tipo de objeto difiere de los demás en la forma de mostrarse.

Por ejemplo, un pixel puede mostrarse con sólo indicarle las coordenadas x,y correspondientes a su posición de la pantalla. En cambio, un círculo requiere de la medida del radio además de las coordenadas x,y de su centro.

Esto nos lleva a pensar que para otros objetos tales como: lineas, rectangulos, elipses, etc. , pueden derivarse nuevas clases tomando como base la clase pixel y en las cuales se conservan los miembros dato x,y además de las funciones miembro dax() y day() definidos en la clase punto ; pero deben definirse nuevas funciones miembro mostrar(), así que, cada vez que se defina una nueva clase derivada de pixel, debe compilarse un nuevo proyecto ( archivo .PRJ ), donde se incluyan los archivos PUNTO2.CPP junto con el archivo correspondiente a la nueva figura ( por ejemplo LINEA.CPP ) para obtener el correspondiente archivo ejecutable ( por ejemplo LINEA.EXE ).

Ya sea que hubieramos escrito las funciones mostrar() de todas las clases de figuras en un solo archivo fuente, o que las hubieramos manejado en varios archivos de un proyecto; habríamos tenido que volver a compilar cada vez que una nueva clase hubiera sido añadida.

Suponiendo que ya se tienen las funciones mostrar() para cada uno de los objetos involucrados, ahora surge la pregunta:

¿ A cuál de las funciónes mostrar() se está haciendo referencia ?
Para responder a esto, con los mecanismos del C++ estudiados hasta antes de esta unidad, se pueden utilizar las siguientes formas:

1.- La que realiza la distinción por medio del nombre ampliado.
    Por ejemplo, mostrar(int,char) no es lo mismo que
    mostrar(int,float). 

2.- La que utiliza el operador de resolución de ámbito, por medio
    del cual circulo::mostrar() se distingue de pixel::mostrar()
    y de  ::mostrar(). 

3.- La que distingue de acuerdo a la clase de objeto que se maneja.
    Por ejemplo: uncirculo.mostrar() invoca a circulo::mostrar(),
    mientras que  unpixel.mostrar() invoca a pixel::mostrar().

Todas esas resoluciones de función se han hecho en tiempo de compilación, por medio del mecanismo conocido como enlace temprano o estático.

La alternativa en C++ se dá a través del polimorfismo, que consiste en la capacidad que posee el código para comportarse de diversas maneras. Cada forma de comportamiento dependerá de una situación específica, determinada en tiempo de ejecución, por medio del enlace tardío.

El enlace tardío o dinámico trabaja por medio de funciones miembro especiales llamadas funciones virtuales.

Página anterior Página siguiente