Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MET2 07 20-Polimorfismo I PDF
MET2 07 20-Polimorfismo I PDF
Polimorfismo I
1
Operadores
Clases
O!"etos en C++
So!recarga
(e Operadores Creacin (inmica de O!"etos
Herencia)
*ipos de +isi!ilidad
Herencia M,ltiple
Polimorfismo
$unciones +irtuales Polimorfismo So!recarga)
Plantillas
Contenedores
Iteradores
20.1 Repaso
Herencia y Composicin $ormas de reutili.acin sistemtica) Me"or) Ms concien.udas) Composicin/ Creamos o!"etos de la clase e0istente dentro de la nue1a clase 2ue estamos creando) Herencia/ Se toma la forma de la clase e0istente modificar la clase e0istente) se a3ade cdigo sin
20.1 Repaso
erar!"as de Clases Cuando una clase deri1a de ms de una clase !ase/ Herencia M#ltiple$ erar!"as de Clases$
Persona
Empleado
%lumno
Profesor
%dministrati1o
class 5clase6deri1ada7 / 8pu!lic9pri1ate: 5!ase17 8;8pu!lic9pri1ate: 5!ase-7: <=> Clase base% clase padre% clase madre% s"perclase/ ?a clase !ase es la clase a creada; de la 2ue se @ereda) Clase deri&ada% clase 'ija% clase 'eredada/ es la clase 2ue se crea a A partir de la clase !ase)
20.1 Repaso
(esarrollo Incremental
de la Composicin)
Podemos a3adir cdigo sin causar fallos en el cdigo e0istente) Si @a fallos se rectifican en el nue1o cdigo) ?as clases B el cdigo C 2uedan separadas de forma limpia) Incluso sin tener el cdigo fuente DCa!ecera)@ cdigo o!"etoE) Permite crecer de forma e1oluti1a Dme !aso en lo anteriorE)
20.1 Repaso
)"perposicin (*ede+inimos en la deri&ada)
class ClaseA { public: void Incrementar() { cout << "Suma 1" << endl; } void Incrementar(int n) { cout << "Suma " << n << endl; } }; // Suma 2 Suma 1 Suma 10 } }; int main() { ClaseB objeto; objeto.Incrementar(); objeto.Incrementar(10); ? objeto.ClaseA::Incrementar(); objeto.ClaseA::Incrementar(10); cin.get(); return 0; } class ClaseB : public ClaseA { public: void Incrementar() { cout << "Suma 2" << endl;
20.2 Polimorfismo
Polimor+ismo El PolimorHsmo Dimplementado en C++ con funciones 1irtualesE es la tercera caracterIstica esencial de un lengua"e orientado a o!"etos.
20.2 Polimorfismo
Concepto de Polimor+ismo C++ nos permite acceder a o!"etos de una clase deri1ada usando punteros a la clase !ase) Slo podemos acceder a atri!utos Si p es un puntero a figura puedo mo1erme por la "erar2uIa) Lo puedo llamar a radioDE MPor 2uJN
Paralelogramo Elipse
$igura
Rectngulo
*rapecio
CIrculo
radio() O
20.2 Polimorfismo
(e+inicin m-s cl-sica de Polimor+ismo #na 1aria!le pasada o esperada puede adoptar m,ltiples formas) Cuando se @a!la de polimorfismo en POO se entienden dos cosas/ 1)C Se puede tra!a"ar con un o!"eto de una clase sin importar de 2uJ clase se trata) Se tra!a"ar igual sea cual sea la clase a la 2ue pertenece el o!"eto) Esto se consigue mediante "erar2uIas de clases clases a!stractas) -)CPosi!ilidad de declarar mJtodos con el mismo nom!re 2ue pueden tener diferentes argumentos dentro de una misma clase) Losotros a - lo @emos llamado/ MN ?a capacidad de un programa de tra!a"ar con ms de un tipo de o!"eto se conoce con el nom!re de polimorfismo)
Rectngulo *rapecio CIrculo
$igura
Elipse
radioDE
C"adrado
20.2 Polimorfismo
Comportamiento por de+ecto Cuando se in1oca un mJtodo de un o!"eto de la clase deri1ada mediante un puntero a un o!"eto de la clase !ase; se trata al o!"eto como si fuera de la clase !ase) Hasta a@ora la @erencia se @a utili.ado/ Para @eredar los miem!ros de una clase !ase) E0iste la posi!ilidad de 2ue un mJtodo de una clase deri1ada se llame como mJtodo de la clase !ase pero tenga un funcionamiento diferente) MOs acordis del pro!lema con la superposicin la 1inculacinN
1Q
20.2 Polimorfismo
Problemas con la .inc"lacin
void Persona :: felizcumple() { edad++; cout << Felicidades!!; mostrar(); } int main() { Alumno alum (77777R, 20, Ana , Ruiz, 3 ); alum.felizcumple(); }
El mensa"e mostrarDE se 1incula con la clase Persona en lugar de con la clase %lumno) La salida es: Felicidades!! 77777R Nombre: Ana Nos falta el curso. Est llamando a mostrar() persona
11
de
20.2 Polimorfismo
Otro ejemplo del problema
class Instrumento { public: void tocar(nota n) const; }; class Instrumento_Viento : public Instrumento { public: void tocar(nota n) const ; }; void afinar(Instrumento& i) { // ... i.tocar(Do); } Instrumento_Viento flauta; afinar(flauta);
La funcin afinar() acepta por referencia un instrumento. Terminar de realizar el programa, compilarlo y mostrar su salida por pantlla. Discusin de problema. Solucin del Problema.
1-
20.2 Polimorfismo
Con&ersin entre Objetos #n o!"eto de la clase !ase tam!iJn &ES #L' o!"eto de la clase deri1ada) %lumno a> Persona p> ))))) p R a> a R p> // LoSS Solo con1ertimos @acia el sentido en 2ue se cumplen interfaces) .inc"lar/ Relacionar la llamada a una funcin con el cuerpo o la implementacin de la funcin) (e forma esttica/ %ntes de e"ecutar) (e forma dinmica/ En tiempo de e"ecucin seg,n la clase del o!"eto) Para decirle al compilador 2ue @aga la 1inculacin en tiempo de e"ecucin !asndose en el tipo o la clase del o!"eto utili.amos/
&irt"al
14
20.2 Polimorfismo
0"nciones &irt"ales
class Persona { ... virtual mostrar(); ... }; void Persona :: felizcumple() { edad++; cout << Felicidades!!; mostrar(); } int main() { Alumno alum (77777R, 20, Ana , Ruiz, 3 ); alum.felizcumple(); }
Slo @a 2ue predecer la declaracin de la funcin con la pala!ra reser1ada &irt"al) Slo la declaracin; no la definicin o implementacin) Slo es necesario declarar la funcin 1irtual en la clase !ase) Lo es necesario @acerlo en las deri1adas) *odas las funciones de las clases deri1adas 2ue enca"en con la declaracin sern llamadas utili.ando el mecanismo 1irtual)
1A
20.2 Polimorfismo
0"nciones .irt"ales Con tocarDE definido en la clase !ase como virtual Tpodemos a3adir tantas nue1as clases como 2ueramos sin 2ue tengamos 2ue tocar una funcin general como afinarDE por el @ec@o de @a!er a3adido un nue1o instrumento) 1)C Esto @aciendo mu fle0i!le mi cdigo) -)C Puedo a3adir nue1o cdigo en forma de nue1as clases sin &molestar' a programadores 2ue estJn usando mis clases !ase) 4)C Separo el cdigo de unas clases deri1adas de otras)
20.2 Polimorfismo
0"nciones .irt"ales ?os mJtodos 1irtuales @eredados son tam!iJn 1irtuales en la clase deri1ada; por lo 2ue si alguna clase @ereda de la clase deri1ada el comportamiento ser similar al indicado) ?os ,nicos mJtodos 2ue no pueden ser declarados como 1irtuales son/ ?os constructores ?os mJtodos estticos ?os operadores neU delete) %tencin; pregunta/ MPor 2uJ no declaramos siempre los mJtodos como 1irtuales pro!lemasN nos 2uitamos
Es una cuestin de rendimiento) ?a 1inculacin esttica se @ace al compilar) ?a 1inculacin dinmica tiene 2ue &!uscar' durante la e"ecucin del programa cul es el cdigo a e"ecutar)
1G
20.2 Polimorfismo
2jercicio 1.- Implementar esta jerarqua de clases con sus mtodos sabiendo que todas las clases deben contar con un destructor, un constructor por defecto y las funcin virtuales tocar(), quien() y ajustar(). Violn no implementa ajustar(). tocar() y quien() son constantes.
De_Viento Instrumento
De_Cuerda
Flauta
Corno
Guitarra
Violn
1K
20.2 Polimorfismo
2jercicio 2.- Mostrar la salida por pantalla de:
Instrumento* orquesta[6]; orquesta[0] = new Flauta; orquesta[1] = new Flauta; orquesta[2] = new Corno; orquesta[3] = new Guitarra; orquesta[4] = new Violin; orquesta[5] = new Violin; for (int i=0;i<6;i++) { orquesta[i].quien(); orquesta[i].ajustar(); } for (int i=0;i<6;i++) { orquesta[i].quien(); orquesta[i].ajustar(); } for (int i=0;i<6;i++) { delete orquesta[i]; } (*) Usar ejercicio preparado....
Instrumento
De_Viento
De_Cuerda
Flauta
Corno
Guitarra
Violn
1O