Вы находитесь на странице: 1из 18

Vigsimo primera Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Polimorfismo II
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

21.1 Repaso
Concepto de S perposicin
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); NO EXISTE! objeto.ClaseA::Incrementar(); objeto.ClaseA::Incrementar(10); cin.get(); return 0; } class ClaseB : public ClaseA { public: void Incrementar() { cout << "Suma 2" << endl;

21.1 Repaso
Polimor!ismo Es la tercera caracter/stica 0ue 1emos 2isto de la POO3

%!straccin de (atos Herencia Polimorfismo


Si p es un puntero a &figura' puedo mo2erme por la "erar0u/a) 4o podemos 1acer esto3 p56radio789 Pero s/ esto3 p56pintar789
Rectngulo

pintar() area() despla"ar()

$igura

Paralelogramo

Elipse

*rapecio

C/rculo

radio()

%tencin 0ue el polimorfimo aplica en situaciones en las 0ue usamos punteros o referencias) :

21.1 Repaso
#e!inicin m$s cl$sica de Polimor!ismo #na 2aria!le pasada o esperada puede adoptar m,ltiples formas) Cuando se 1a!la de polimorfismo en POO se entienden dos cosas3 1)5 Se puede tra!a"ar con un o!"eto de una clase sin importar de 0u; clase se trata) pintar78 -)5Posi!ilidad de declarar m;todos con el mismo $igura area78 nom!re 0ue pueden tener diferentes argumentos despla?ar78 dentro de una misma clase)
Paralelogramo Elipse

Para nosotros - es 3 <<<<<<<<<<<<<<<)


Rectngulo *rapecio C/rculo

=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)

radio78
C adrado

>

21.1 Repaso
Comportamiento por de!ecto Cuando se in2oca un m;todo de un o!"eto de la clase deri2ada mediante un puntero a un o!"eto de la clase !ase@ se trata al o!"eto como si fuera de la clase !ase) Hasta a1ora la 1erencia se 1a utili?ado3 Para 1eredar los miem!ros de una clase !ase) EAiste la posi!ilidad de 0ue un m;todo de una clase deri2ada se llame como m;todo de la clase !ase pero tenga un funcionamiento diferente) BOs acordis del pro!lema con la superposicin la 2inculacinC

21.1 Repaso
Comportamiento por de!ecto%
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. Por defecto se llama a tocar de la clase base. Si declaramos tocar78 como 2irtual en la clase !ase Instrumento cam!iamos el comportamiento por defecto) Enviamos un mensaje al objeto y dejamos que sea el objeto el que se preocupe de qu hacer con l

21.1 Repaso
Con&ersin entre Objetos #n o!"eto de la clase !ase tam!i;n &ES #4' o!"eto de la clase deri2ada) %lumno a9 Persona p9 ))))) p F a9 a F p9 // 4oGG Solo con2ertimos 1acia el sentido en 0ue se cumplen interfaces) 'inc lar% Relacionar la llamada a una funcin con el cuerpo o la implementacin de la funcin) (e forma esttica3 %ntes de e"ecutar) (e forma dinmica3 En tiempo de e"ecucin seg,n la clase del o!"eto) Para decirle al compilador 0ue 1aga la 2inculacin en tiempo de e"ecucin !asndose en el tipo o la clase del o!"eto utili?amos3

&irt al

21.1 Repaso
(n p nteros) na jerar* a de clases y ! nciones &irt ales++++ 4os permite 1acer una funcin gen;rica afinar78) Si otro programador aIade un instrumento mi programa3

,sig e ! ncionandovirtual tocar()


Instrumento

Instrumento* p;

De_Viento

De_Cuerda

Saxo

Flauta

Corno

Guitarra

Violn

21.2 Polimorfismo
Clases .bstractas % menudo en el diseIo lo 0ue 0ueremos es utili?ar la clase !ase para presentar un interfa? para sus clases deri2adas) 4o me interesa 0ue 1a a o!"etos de esa clase3 Slo 0uiero 0ue se deri2en otras clase de ella) =as clases deri2adas tienen las funciones de la !ase por 1erencia) =a nue2a clase sir2e para 1acer &upcasting' 7con2ersin 1acia arri!a8) Esto se consigue creando una una

clase a!stracta

poniendo como m/nimo

funcin 2irtual pura)


#sa la pala!ra reser2ada &2irtual') Es seguida por &FK')

1K

21.2 Polimorfismo
Clases .bstractas =as funciones 2irtuales puras me permiten poner una funcin en el interfa? sin tener 0ue poner un cdigo 0ue no interesa) BPara 0u; poner cdigo dentro de pintar78 de la clase $iguraC =o 0ue interesa es 0ue 1a a cdigo para pintar en las clases deri2adas) Cuadrado@ C/rculo@))) %dems o!ligamos a 0ue las clase deri2adas a 0ue implementen cdigo para las funciones 2irtuales)
pintar78 area78 despla?ar78
Paralelogramo $igura

Elipse

Rectngulo

*rapecio

C/rculo

C adrado

En el e"emplo@ 1asta a1ora@ pon/amos cdigo tonto en la funcin pintar78 como mostrar algo por pantalla) Lue se llame a la funcin $igura33pintar78 es 0ue algo anda mal) 4o tiene sentido)
11

21.2 Polimorfismo
Clases .bstractas
class Figura { public: void pintar() const = 0; }; class Elipse : public Figura { public: void pintar() const { cout << Elipse::pintar() }; }; Figura& rfig; Figura* pfig; Elipse mi_elipse; rfig = mielipse; pfig = &mi_elipse; rfig.pintar(); pfig->pintar();

La funcin pintar() funcin virtual pura. =a clase a!stracta) $igura es

es

una clase

una

1-

21.2 Polimorfismo
Clases .bstractas y / nciones 'irt ales P ras =as funciones 2irtuales son ,tiles por0ue3 Hacen eApl/cita la a!stracccin de una clase) Indican al usuario al compilador cmo se usa la clase)
$igura

Paralelogramo

Elipse

Rectngulo

*rapecio

C/rculo

#na clase a!stracta no se puede pasar por 2alor)

C adrado

%l con2ertir una clase en a!stracta tam!i;n garanti?amos 0ue siempre se use un puntero o una referencia cuando se 1aga &upcasting' a esa clase) Podemos tener funciones 2irtuales puras funciones &normales' en la misma clase %) 4o puedo crear o!"etos de % pero tengo el cdigo com,n lo ms &arri!a' posi!le)
1.

21.2 Polimorfismo
Clases .bstractas
class Mascota { public: virtual void comer() const = 0; //! virtual void dormir() const = 0{} }; void Mascota::comer() const { cout <<"Mascota::comer()"<< endl; } class Perro : public Mascota { public: void comer() const { Mascota::comer(); } }; int main() { Perro simba; simba.comer(); }

La funcin pintar() funcin virtual pura. Podemos poner cdigo funcin 2irtual pura)

es en

una una

4o podemos 1acerlo de forma &inline' en la declaracin 7+er dormir788) Es una forma de poner cdigo 0ue luego sea reutili?a!le)

1:

21.2 Polimorfismo
#estr ctores 'irt ales Supongamos 0ue tenemos una estructura de clases en la 0ue en alguna de las clases deri2adas eAista un destructor) #n destructor es una funcin como las dems@ por lo tanto@ si destruimos un o!"eto referenciado mediante un puntero a la clase !ase@ el destructor no es 2irtual@ estaremos llamando al destructor de la clase !ase) Esto puede ser desastroso@ a 0ue nuestra clase deri2ada puede tener ms tareas 0ue reali?ar en su destructor 0ue la clase !ase de la 0ue procede) Por lo tanto de!emos respetar siempre ;sta regla3

&si en una clase eAisten funciones 2irtuales@ si creamos un destructor ;ste de!e ser 2irtual'
1>

21.2 Polimorfismo
#estr ctores 'irt ales Supongamos 0ue tenemos una estructura de clases en la 0ue en alguna de las clases deri2adas eAista un destructor) #n destructor es una funcin como las dems@ por lo tanto@ si destruimos un o!"eto referenciado mediante un puntero a la clase !ase@ el destructor no es 2irtual@ estaremos llamando al destructor de la clase !ase) Esto puede ser desastroso@ a 0ue nuestra clase deri2ada puede tener ms tareas 0ue reali?ar en su destructor 0ue la clase !ase de la 0ue procede) Por lo tanto de!emos respetar siempre ;sta regla3

&si en una clase eAisten funciones 2irtuales@ si creamos un destructor ;ste de!e ser 2irtual'
1D

21.2 Polimorfismo
Polimor!imo y Clases .bstractas Resumiendo muc1o3

(ada una clase a!stracta@ no se pueden crear o!"etos de esa clase !ase) Se pueden crear punteros 0ue a o!"etos de la clase !ase a!stracta 0ue realmente apunten a o!"etos de la clase deri2ada)
PolimorMsmo signiMca 'formas diferentes') Se tiene la misma 2ista3 la interfa? comun en la clase !ase) (iferentes formas de usarla3 las diferentes 2ersiones de las funciones 2irtuales)

1E

21.3 Ejercicios
1.- Crea una jerarqua simple gura: una clase base llamada Figura y una clases derivadas llamadas Circulo, Cuadrado, y Triangulo. En la clase base, hay que hacer una funcion virtual llamada dibujar(), y sobreescribirla en las clases derivadas. Hacer un array de punteros a objetos Figura creados con new (en el montn heap) y que obligue a realizar upcasting de los punteros y llamar a dibujar() a travs de la clase base para vericar el comportamiento de las funciones virtuales. Ver el programa paso a paso usando el depurador. 2.- Modica el Ejercicio pura. Intenta crear un virtual pura dentro del funcion virtual pura crea 1 de tal forma que dibujar() sea una funcin virtual objeto de tipo Figura. Intenta llamar a la funcin constructor y mira lo que ocurre. Dejndolo como una una denicion para dibujar().

3.- Aumentando el Ejercicio 2, crea una funcion que use un objeto Figura por valor e intente hacer un upcast de un objeto derivado como argumento. Vea lo que ocurre. Arregla la funcin usando una referencia a un objeto Figura.

1H