1. Tema:
Polimorfismo en C++
Nombre:
Iván Villarreal
Profesora:
María de Dimares
Materia:
Estructura de Datos I
2012
2. INTRODUCCION
Una de las tres mayores facetas de la programación orientada a
objetos es el polimorfismo. Aplicado a C++, el término
polimorfismo usado para describir el proceso en el cual
diferentes implementaciones de una función pueden ser
accedidas a través del mismo nombre. Por esta razón, el
polimorfismo es en ocasiones caracterizado por la frase "Una
interface, múltiples métodos." Esto significa que cada miembro
de una clase general de operaciones puede ser accedida del
mismo modo, incluso cuando las acciones especificas con cada
operación puedan diferir.
3. Polimorfismo
En programación orientada a objetos el polimorfismo se
refiere a la posibilidad de enviar un mensaje a un grupo de
objetos cuya naturaleza puede ser heterogénea. El único
requisito que deben cumplir los objetos que se utilizan de
manera polimórfica es saber responder al mensaje que se les
envía.
La apariencia del código puede ser muy diferente
dependiendo del lenguaje que se utilice, más allá de las
obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta
con un sistema de tipos dinámico (en los que las variables
pueden contener datos de cualquier tipo u objetos de
cualquier clase) como Smalltalk no se requiere que los
objetos que se utilizan de modo polimórfico sean parte de
una jerarquía de clases.
4. En resumen…
En la programación orientada a objetos, la esencia del
polimorfismo no atañe a la clase o prototipo de la que
provienen los objetos. Aún así, en los lenguajes basados en
clases, es habitual (y en algunos tal vez sea el único modo)
que dichos objetos pertenezcan a subclases pertenecientes
a una misma jerarquía. Entonces, el polimorfismo debe
verse como una forma flexible de usar un grupo de objetos
(como si fueran sólo uno).
Podría decirse que el polimorfismo en esencia refiere al
comportamiento de los objetos, no a su pertenencia a una
jerarquía de clases (o a sus tipos de datos).
5. #include<iostream>
EJEMPLOS
using namespace std;
class Figura {
private:
float base;
float altura;
public:
void captura();
virtual unsigned float perimetro()=0;
virtual unsigned float area()=0;
};
class Rectangulo: public Figura {
public:
void imprime();
unsigned float perimetro(){return 2*(base+altura);}
unsigned float area(){return base*altura;}
};
class Triangulo: public Figura {
public:
void muestra();
unsigned float perimetro(){return 2*altura+base}
unsigned float area(){return (base*altura)/2;}
};
void Figura::captura()
{
cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO
ISÓSCELES Y UN RECTANGULO:" << endl;
cout << "escribe la altura: ";
cin >> altura;
cout << "escribe la base: ";
cin >> base;
cout << "EL PERIMETRO ES: " << perimetro();
cout << "EL AREA ES: " << area();
}
7. PUNTEROS A TIPOS DERIVADOS.
La fundación del polimorfismo en tiempo de ejecución es el puntero
de la clase base. Punteros a la clase base y clases derivadas están
relacionados en la manera en que otros tipos de puntero no lo están.
Como aprendió al principio del libro, un puntero de un tipo
generalmente no puede apuntar a un objeto de otro tipo. Sin
embargo, los punteros de clase base y objetos derivados son la
excepción a esta regla. En C++, un puntero de la clase base podría
ser usado para apuntar a un objeto de cualquier clase derivada de
esa base. Por ejemplo, asumiendo que usted tiene una clase base
llamada 'clase B' y una clase llamada 'clase_D', la cual es derivada de
'clase_B'. En C++, cualquier puntero declarado como un puntero a
'clase_B' puede tambien ser un puntero a 'clase_D'. Entonces, dado
8. REFERENCIAS A TIPOS DERIVADOS
Similar a la acción de punteros ya descritas, una
referencia a la clase base puede ser usada para referirse
a un objeto de un tipo derivado. La mas común
aplicación de esto es encontrada en los parámetros de la
funciones. Una parámetro de referencia de la clase base
puede recibir objetos de la base clase así como también
otro tipo derivado de esa misma base.
9. Clasificación
Se puede clasificar el polimorfismo en dos grandes
clases:
Polimorfismo dinámico (o polimorfismo
paramétrico) es aquél en el que el código no
incluye ningún tipo de especificación sobre el tipo
de datos sobre el que se trabaja. Así, puede ser
utilizado a todo tipo de datos compatible.
Polimorfismo estático (o polimorfismo ad hoc) es
aquél en el que los tipos a los que se aplica el
polimorfismo deben ser explicitados y declarados
uno por uno antes de poder ser utilizados.
10. Diferencia entre polimorfismo y sobre carga
El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante
ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin
necesidad de tocar las clases ya existentes (imaginemos que deseamos añadir
una clase Multiplicar), basta con recompilar todo el código que incluye los
nuevos tipos añadidos
La sobrecarga se da siempre dentro de una sola clase, mientras que el
polimorfismo se da entre clases distintas.
Un método está sobrecargado si dentro de una clase existen dos o más
declaraciones de dicho método con el mismo nombre pero con parámetros
distintos, por lo que no hay que confundirlo con polimorfismo.
En definitiva: La sobrecarga se resuelve en tiempo de compilación utilizando los
nombres de los métodos y los tipos de sus parámetros; el polimorfismo se resuelve
en tiempo de ejecución del programa, esto es, mientras se ejecuta, en función
de la clase a la que pertenece el objeto.
11. FUNCIONES VIRTUALES
El polimorfismo en tiempo de ejecución es logrado por una
combinación de dos características: 'Herencia y funciones virtuales".
Aprendió sobre la herencia en el capitulo precedente. Aquí,
aprenderá sobre función virtual.
Una función virtual es una función que es declarada como 'virtual'
en una clase base y es redefinida en una o mas clases derivadas.
Además, cada clase derivada puede tener su propia versión de la
función virtual. Lo que hace interesantes a las funciones virtuales es
que sucede cuando una es llamada a través de un puntero de
clase base ( o referencia ). En esta situación, C++ determina a cual
versión de la función llamar basándose en el tipo de objeto
apuntado por el puntero. Y, esta determinación es hecha en
'tiempo de ejecución'. Además, cuando diferentes objetos son
apuntados, diferentes versiones de la función virtual son ejecutadas.
12. PORQUE FUNCIONES VIRTUALES
Como se declaraba en el inicio de este capítulo, las funciones virtuales
en combinación con tipos derivados le permiten a C++ soportar
polimorfismo en tiempo de ejecución. El polimorfismo es esencial para la
programación orientada a objetos por una razón: Esta permite a una
clase generalizada especificar aquellas funciones que serán comunes a
todas las derivadas de esa clase, mientras que permite a una clase
derivada definir la implementación específica de algunos o todas de
esas funciones. A veces esta idea es expresada como: La clase base
dicta la 'interface' general que cualquier objeto derivado de esa clase
tendrá, pero permite a la clase derivada definir el método actual usado
para implementar esa interface. De ahí que la frase "una interface
múltiples métodos" sea usada a menudo para describir el polimorfismo.
13. Parte del truco de aplicar el polimorfismo de una manera satisfactoria es
comprender que la clase base y derivada forman una jerarquía, la cual se
mueve de mayor a menor generalización (base a derivada). Diseñada
correctamente, la clase base provee todos los elementos que una clase
derivada puede usar directamente. También define cuales funciones la
clase derivada debe implementar por su cuenta. Esto permite a la clase
derivada la flexibilidad para definir sus propios métodos, y aun mantener un
interface consistente.
Eso es, como la forma de la interface es definida por la clase base,
cualquier clase derivada compartirá esa interface común. Además, el uso
de funciones virtuales hace posible para la clase base definir interfaces
genéricas que serán usada por todas las clases derivadas. En este punto,
usted debe preguntarse a si mismo porque una consistente interface con
múltiples implementaciones es importante. La respuesta, nuevamente, no
lleva a la fuerza central manejadora detrás de la programación orientada a
objetos: Esta ayuda al programador a manejar programas de complejidad
creciente.
14. FUNCIONES VIRTUALES PURAS Y CLASES
ABSTRACTAS
Como se ha visto, cuando una funcion virtual que no es redefinida en
una clase derivada es llamada por un objeto de esa clase derivada, la
version de la funcion como se ha definido en la clase base es utilizada.
Sin embargo, en muchas circunstancias, no habra una declaracion con
significado en una funcion virtual dentro de la clase base. Por ejemplo,
en la clase base 'figura' usada en el ejemplo anterior, la definicion de
'mostrar_area()' es simplemente un sustituto sintetico. No computara ni
mostrara el area de ningun tipo de objeto. Como vera cuando cree sus
propias librerias de clases no es poco comun para una funcion virtual
tener una definicion sin significado en el contexto de su clase base.