Está en la página 1de 18

Vigsima Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Polimorfismo I
1

Estado del Programa


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

Operadores

Clases

#so aplicacin Constructores Constantes e &inline'

O!"etos en C++

$unciones %migas So!recarga de $unciones

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

Es una 1enta"a de la Herencia

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.

%!straccin de (atos Herencia Polimorfismo


Es otra forma de separar interfa. de implementacin) ?a encapsulacin nos permite crear nue1os tipos de datos com!inando caracterIsticas Datri!utosE comportamientos DmJtodosE) Control de acceso/ Separamos interfa. de implementacin @aciendo pri&ados los detalles) ?a @erencia nos permite tratar a un o!"eto como de su propia clase o como K su clase !ase)

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

mJtodos 2ue e0istan en la clase !ase/


pintar() area() despla,ar()

$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

pintarDE areaDE despla.arDE


Paralelogramo

$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 mtodo felizcumple() no est definido en Alumno. Se !usca encuentra) en persona; se

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)

1irtual 5tipo7 5nom!re6funcin7D5lista6parmetros7E 8<=:>


12n&iamos "n mensaje al objeto y dejamos !"e sea el objeto el !"e se preoc"pe de !" 'acer con l3 Sa!er 2uJ mJtodos son 1irtuales es tarea de la fase de dise3o) Lo es fcil)
1F

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

También podría gustarte