You are on page 1of 18

VigsimaSesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Polimorfismo I
1

EstadodelPrograma
Introduccin a la POO Repaso de Conceptos
Historia de la Programacin Conceptos de POO Estndares de Programacin Punteros y Memoria C++ Mi primera Clase E/S Control y Operadores

Clases y Objetos en C++


Uso y aplicacin Constructores Constantes e inline

Funciones Amigas Sobrecarga de Funciones

Sobrecarga
De Operadores Creacin Dinmica de Objetos

Herencia.

Tipos de Visibilidad

Herencia Mltiple

Polimorfismo
Funciones Virtuales Polimorfismo y Sobrecarga.

Plantillas

Contenedores

Iteradores

20.1Repaso
Herencia y Composicin Formas de reutilizacin sistemtica. Mejor. Ms concienzudas. Composicin: Creamos objetos de la clase existente dentro de la nueva clase que estamos creando. Herencia: Se toma la forma de la clase existente y se aade cdigo sin modificar la clase existente.

20.1Repaso
Jerarquas de Clases Cuando una clase deriva de ms de una clase base: Herencia Mltiple. Jerarquas de Clases.
Persona

Empleado

Alumno

Profesor

Administrativo

class <clase_derivada> : [public|private] <base1> [,[public|private] <base2>] {}; Clase base, clase padre, clase madre, superclase: La clase base es la clase ya creada, de la que se hereda. Clase derivada, clase hija, clase heredada: es la clase que se crea a 4 partir de la clase base.

20.1Repaso
Desarrollo Incremental

Es una ventaja de la Herencia y de la Composicin. Podemos aadir cdigo sin causar fallos en el cdigo existente. Si hay fallos se rectifican en el nuevo cdigo. Las clases y el cdigo - quedan separadas de forma limpia. Incluso sin tener el cdigo fuente (Cabecera.h y cdigo objeto). Permite crecer de forma evolutiva (me baso en lo anterior).

20.1Repaso
Superposicin (Redefinimos en la derivada)
classClaseA { public: voidIncrementar() { cout<<"Suma1"<<endl; } voidIncrementar(intn) { cout<<"Suma"<<n<<endl; } }; Suma2 Suma1 Suma10 classClaseB:publicClaseA { public: voidIncrementar() { cout<<"Suma2"<<endl; } }; intmain() { ClaseBobjeto; objeto.Incrementar(); //objeto.Incrementar(10);? objeto.ClaseA::Incrementar(); objeto.ClaseA::Incrementar(10); cin.get(); return0; }

20.2Polimorfismo
Polimorfismo El Polimorsmo (implementado en C++ con funciones virtuales) es la tercera caracterstica esencial de un lenguaje orientado a objetos.

Abstraccin de Datos Herencia Polimorfismo


Es otra forma de separar interfaz de implementacin. La encapsulacin nos permite crear nuevos tipos de datos combinando caractersticas (atributos) y comportamientos (mtodos). Control de acceso: Separamos interfaz de implementacin haciendo privados los detalles. La herencia nos permite tratar a un objeto como de su propia clase o como 7 su clase base.

20.2Polimorfismo
Concepto de Polimorfismo C++ nos permite acceder a objetos de una clase derivada usando punteros a la clase base. Slo podemos acceder a atributos y mtodos que existan en la clase base: Si p es un puntero a figura puedo moverme por la jerarqua. No puedo llamar a radio() Por qu?
Paralelogramo Elipse

pintar() area() desplazar()

Figura

Rectngulo

Trapecio

Crculo

radio() 8

20.2Polimorfismo
Definicin ms clsica de Polimorfismo Una variable pasada o esperada puede adoptar mltiples formas. Cuando se habla de polimorfismo en POO se entienden dos cosas: 1.- Se puede trabajar con un objeto de una clase sin importar de qu clase se trata. Se trabajar igual sea cual sea la clase a la que pertenece el objeto. Esto se consigue mediante jerarquas de clases y clases abstractas. 2.-Posibilidad de declarar mtodos con el mismo nombre que pueden tener diferentes argumentos dentro de una misma clase. Nosotros a 2 lo hemos llamado: ? La capacidad de un programa de trabajar con ms de un tipo de objeto se conoce con el nombre de polimorfismo.
Rectngulo Trapecio Crculo

pintar() area() desplazar()


Paralelogramo

Figura

Elipse

radio()
Cuadrado

20.2Polimorfismo
Comportamiento por defecto Cuando se invoca un mtodo de un objeto de la clase derivada mediante un puntero a un objeto de la clase base, se trata al objeto como si fuera de la clase base. Hasta ahora la herencia se ha utilizado: Para heredar los miembros de una clase base. Existe la posibilidad de que un mtodo de una clase derivada se llame como mtodo de la clase base pero tenga un funcionamiento diferente. Os acordis del problema con la superposicin y la vinculacin?

10

20.2Polimorfismo
Problemas con la Vinculacin
voidPersona::felizcumple() { edad++; cout<<Felicidades!!; mostrar(); } intmain() { Alumnoalum(77777R,20, Ana,Ruiz,3); alum.felizcumple(); }

Elmtodofelizcumple()noest definidoenAlumno. Se busca encuentra. en persona, y se

El mensaje mostrar() se vincula con la clase Persona en lugar de con la clase Alumno. Lasalidaes: Felicidades!! 77777RNombre:Ana

Nosfaltaelcurso. Est llamando a mostrar() de persona


11

20.2Polimorfismo
Otro ejemplo del problema
classInstrumento { public: voidtocar(notan)const; }; classInstrumento_Viento:public Instrumento { public: voidtocar(notan)const; }; voidafinar(Instrumento&i) { //... i.tocar(Do); } Instrumento_Vientoflauta; afinar(flauta);

La funcin afinar() acepta por referenciauninstrumento.

Terminar de realizar el programa, compilarlo y mostrar susalidaporpantlla. Discusindeproblema. SolucindelProblema.

12

20.2Polimorfismo
Conversin entre Objetos Un objeto de la clase base tambin ES UN objeto de la clase derivada. Alumno a; Persona p; ..... p = a; a = p; // No!! Solo convertimos hacia el sentido en que se cumplen interfaces. Vincular: Relacionar la llamada a una funcin con el cuerpo o la implementacin de la funcin. De forma esttica: Antes de ejecutar. De forma dinmica: En tiempo de ejecucin segn la clase del objeto. Para decirle al compilador que haga la vinculacin en tiempo de ejecucin basndose en el tipo o la clase del objeto utilizamos:

virtual

13

20.2Polimorfismo
Funciones virtuales
classPersona { ... virtualmostrar(); ... }; voidPersona::felizcumple() { edad++; cout<<Felicidades!!; mostrar(); } intmain() { Alumnoalum(77777R,20, Ana,Ruiz,3); alum.felizcumple(); }

Slo hay que predecer la declaracin de la funcin con la palabra reservada virtual. Slo la declaracin, no la definicin o implementacin. Slo es necesario declarar la funcin virtual en la clase base. No es necesario hacerlo en las derivadas. Todas las funciones de las clases derivadas que encajen con la declaracin sern llamadas utilizando el mecanismo virtual.
14

20.2Polimorfismo
Funciones Virtuales Con tocar() definido en la clase base como virtual podemos aadir tantas nuevas clases como queramos sin que tengamos que tocar una funcin general como afinar() por el hecho de haber aadido un nuevo instrumento. 1.- Estoy haciendo muy flexible mi cdigo. 2.- Puedo aadir nuevo cdigo en forma de nuevas clases sin molestar a programadores que estn usando mis clases base. 3.- Separo el cdigo de unas clases derivadas de otras.

virtual <tipo> <nombre_funcin>(<lista_parmetros>) [{}];


Enviamos un mensaje al objeto y dejamos que sea el objeto el que se preocupe de qu hacer con l Saber qu mtodos son virtuales es tarea de la fase de diseo. No es fcil.
15

20.2Polimorfismo
Funciones Virtuales Los mtodos virtuales heredados son tambin virtuales en la clase derivada, por lo que si alguna clase hereda de la clase derivada el comportamiento ser similar al indicado. Los nicos mtodos que no pueden ser declarados como virtuales son: Los constructores Los mtodos estticos Los operadores new y delete. Atencin, pregunta: Por qu no declaramos siempre los mtodos como virtuales y nos quitamos problemas? Es una cuestin de rendimiento. La vinculacin esttica se hace al compilar. La vinculacin dinmica tiene que buscar durante la ejecucin del programa cul es el cdigo a ejecutar.
16

20.2Polimorfismo

Ejercicio 1.Implementarestajerarquadeclasesconsusmtodossabiendo que todas las clases deben contar con un destructor, un constructorpordefectoylasfuncinvirtualestocar(),quien() yajustar(). Violnnoimplementaajustar(). tocar()yquien()sonconstantes.
De_Viento Instrumento

De_Cuerda

Flauta

Corno

Guitarra

Violn

17

20.2Polimorfismo
Ejercicio 2.Mostrarlasalidaporpantallade:
Instrumento*orquesta[6]; orquesta[0]=newFlauta; orquesta[1]=newFlauta; orquesta[2]=newCorno; orquesta[3]=newGuitarra; orquesta[4]=newViolin; orquesta[5]=newViolin; for(inti=0;i<6;i++) { orquesta[i].quien(); orquesta[i].ajustar(); } for(inti=0;i<6;i++) { orquesta[i].quien(); orquesta[i].ajustar(); } for(inti=0;i<6;i++) { deleteorquesta[i]; } (*)Usarejerciciopreparado....
Instrumento

De_Viento

De_Cuerda

Flauta

Corno

Guitarra

Violn

18

You might also like