You are on page 1of 21

Dcimo novena Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Herencia III
1

Estado del Programa


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 O !etos en C++


"so y aplicacin Constructores Constantes e %inline&

#unciones $migas So recarga de #unciones

So recarga
'e Operadores Creacin 'inmica de O !etos

Herencia(

)ipos de *isi ilidad

Herencia M+ltiple

Polimor,ismo
#unciones *irtuales Polimor,ismo y So recarga(

Plantillas

Contenedores

Iteradores

19.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 ,orma de la clase e0istente y se a3ade cdigo sin modi,icar la clase e0istente( 4a 5erencia nos permite/ Crear nue1as clases a partir de clases e0istentes( Conser1ando las propiedades de la clase original( $3adir nue1os m6todos y atri utos a la clase original( Rede,inir comportamiento de m6todos(

19.1 Repaso
Herencia Cuando una clase deri1a de ms de una clase ase/ Herencia M ltiple! "erar#$as de Clases!
Persona

Empleado

$lumno

Pro,esor

$dministrati1o

class 8clase9deri1ada: / ;pu lic<pri1ate= 8 ase1: ;>;pu lic<pri1ate= 8 ase-:= ?@A Clase base% clase padre% clase madre% s$perclase/ 4a clase clase ya creada> de la 2ue se 5ereda( ase es la

Clase deri&ada% clase 'ija% clase 'eredada/ es la clase 2ue se crea a B partir de la clase ase(

19.1 Repaso
Control de (cceso en la Herencia class 8clase9deri1ada: / ;pu lic<pri1ate= 8 ase1: ;>;pu lic<pri1ate= 8 ase-:= ?@A
Persona

$lumno

Tipo de Dato Clase Base Private Protected Public

Herencia con public Herencia con private Otros No accesible directamenteNo accesible directamenteNo accesible Protected Private No accesible Public Private Accesible (. ->)

19.1 Repaso
Hay Miembros #$e no se 'eredan a$tom)ticamente 4a clase deri1ada 5ereda todos los atri utos y todos los m6todos> e0cepto/ * Constr$ctores * +estr$ctor * Operador de asignacin Constr$ctores y destr$ctor, Si en la su clase no estn de,inidos> se crea un constructor por de,ecto y un destructor> aun2ue sin 2ue 5agan nada en concreto( Operador de asignacin, Si en la su clase no est de,inido> se crea uno el operador de asignacin de la superclase( por de,ecto 2ue se asa en

MO-(./"( Se de en crear los constructores y el destructor en la su clase( Se de e de,inir el operador de asignacin en la su clase(

19.1 Repaso
Orden de llamada
Constructor de la Clase 0ase 'estructor de la Clase +eri&ada
operatorG Clase +eri&ada

Constructor de la Clase +eri&ada 'estructor de la Clase 0ase

#IF

#IF

E0isteH FO operatorG Clase 0ase

SI

#IF

E0isteH

SI

FO

Copia Iit a Iit

19.1 Repaso
Operador (signacin
ClaseBase& ClaseBase :: operator = ( ClaseBase c ) { b1 = c.b1; b2 = c.b2; b3 = c.b3; return *this; }; ClaseDerivada& ClaseDerivada :: operator = ( ClaseDerivada d ) { s1 = d.s1; s2 = d.s2; return *this; }; ClaseDerivada ob1 ( 6,7,4,8.2, f ); ClaseDerivada ob2 ( 0,0,0, 0, h); ob2 = ob1;

KLu6 m6todo se e!ecutaH b1 6 b2 7 b3 - 4 b1 0 b2 0 b3 - 0 s1 - 8.2 s2 - f

s1 - 0 s2 - h

b1 0 b2 0 b3 - 0

s1 - 8.2 s2 - f

ClaseBase::operator=(d);
J

19.1 Repaso
Pasos de Mensaje con Herencia E!ercicio/ alum(mostrarMNA alum(,eli.cumpleMNA alum(matricularMNA
Iuscamos m6todo en la clase

E0isteH FO SI Iuscamos en la primera Superclase

SI

#IF

KHay ms Clases en la !erar2uPaH

E0isteH FO

SI

FO

ERROR O

19.1 Repaso
Problemas con la 1inc$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> y se

El mensa!e mostrarMN se 1incula con la clase Persona en lugar de con la clase $lumno( La salida es: Felicidades!! 77777R Nombre: Ana (*) Nos falta el curso.

1Q

19.2 Herencia
2$perposicin y 2obrecarga Ra 5emos 1isto 2ue puedo rede,inir un m6todo de una clase nue1a clase deri1ada( 2$perponemos el nue1o m6todo so re el e0istente( Cuando de superpone una ,uncin> se oc$ltan todas las 3$nciones con el mismo nom re en la clase ase( Fo accedemos a ninguna de las ,unciones superpuestas de la clase ase> aun2ue tengan distinto n+mero de parmetros> o 6stos o el 1alor de retorno tengan distintos tipos( Para acceder a los m6todos de la clase el nom re completo( ase estaremos o ligados a utili.ar ase en mi

Clase Base::metodo_que_sea(....);
11

19.2 Herencia
2$perposicin por rede3inicin en la Herencia
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;

1-

19.2 Herencia
2$perposicin y 2obrecarga 4o ms ,recuente es 2ue la 1ersin de la clase deri1ada llame a la 1ersin de la clase ase( 4a 1ersin de la clase ase 5ace su parte de la nue1a tarea( En el caso de $lumno/ %4lamo a mostrarMN de Persona y luego muestro las notas(& Alumno::mostrar(void) { Persona::mostrar(); cout << Nota : << nota_ << endl; } KLu6 ocurre si no utili.amos el operador de resol$cin de )mbito (,,)H SSRecursin In,initaTT
17

19.2 Herencia
Con&ersin entre Objetos "n o !eto de la clase ase tam i6n %ES "F& o !eto de la clase deri1ada( Pero/ el tipo de la clase ase y el tipo de la clase deri1ada son distintos( Ia!o 5erencia p$blic/ 4os o !etos de la clase deri1ada se pueden tratar como si ,ueran de la ase( 4a clase deri1ada tiene miem ros 2ue se corresponden con los de la ase( Con1ertir de deri1ada a ase es correcto y tiene sentido( Fo al re16s( Si tenemos un puntero de la clase ase apuntando a un o !eto de la clase deri1ada/ El puntero de la clase ase slo 1e la parte de la clase ase( $lumno aA Persona pA ((((( p G aA a G pA // FoTT

1B

19.2 Herencia
Clases (bstractas "na clase $ stracta es a2uella 2ue solo sir1e como ase de otras clases( Fo se puede crear o !etos de esa clase Mno se de eN( Formalmente se trata de clases 2ue representan conceptos a stractos de los 2ue no tiene sentido crear o !etos( Fo tiene sentido tra a!ar con %,iguras& o %paralelogramos&( Modela comportamiento com+n( Implementa M6todos comunes(
Paralelogramo #igura

Elipse

Rectngulo

)rapecio

CPrculo

Esta lece m6todos comunes y o liga a 2ue se implementen en las deri1adas(


1C

19.2 Herencia
+esarrollo Incremental Es una 1enta!a de la Herencia y de la Composicin( Podemos a3adir cdigo sin causar ,allos en el cdigo e0istente( Si 5ay ,allos se recti,ican en el nue1o cdigo( 4as clases U y el cdigo V 2uedan separadas de ,orma limpia( Incluso sin tener el cdigo ,uente MCa ecera(5 y cdigo o !etoN( Permite crecer de ,orma e1oluti1a Mme aso en lo anteriorN(

4a 5erencia signi,ica/ %Esta nue1a clase 2ue estoy creando es un tipo de esta clase antigua&

1D

19.3 Herencia Prctica


/jemplo
class Punto { protected: int x; int y; public: Punto (int a=0, b=0); void setPunto(int,int); int getX() const {return x;}; int getY() const {return y;}; void mostrar() const; }; Punto :: Punto(int a, int b) { setPunto(a,b); } } Uso de Punto -------------------------Punto p( 72, 115 ); cout << La coordenada de x es << p.getX() << endl; cout << La coordenada de y es << p.getY() << endl; // No puedo: // cout << X es: << p.x << endl; p.mostrar(); } void Punto::mostrar() { cout<<"[" <<p.x<<","<<p.y<< "]"; cout << endl; void Punto::setPunto(int a,int b) { x=a; y=b;

1E

19.3 Herencia prctica


/jemplo
class Circulo : public Punto { protected: double radio; public: Circulo (double r= 0.0, int x=0, int y=0); void setRadio(double); double getRadio() const; double area () const; void mostrar() const; }; Circulo::Circulo(double r,int a,int b) : Punto (a,b) { setRadio(r); } } } void Circulo :: mostrar () const { Punto::mostrar(); cout << Radio = << radio << endl; } double Circulo :: area () const { return 3.14159 * radio * radio; void Circulo :: setRadio(double r) { radio = (r >=0 ? r : 0); } double Circulo :: getRadio() const { return radio;

1J

19.3 Herencia prctica


/jemplo
class Cilindro: public Circulo { protected: double altura; public: Cilindro( double h=0.0, double r=0.0, int x=0, int void setAltura (double); double daAltura () const ; double area () const ; double volumen () const; void mostrar() const; } Cilindro::Cilindro(double h, double r, int x, int y): Circulo(r, x, y) { setAltura( h ); } } y=0); } double Cilindro::area() const { return 2*Circulo::area() + 2* 3.14159 * radio * altura; } double Cilindro::volumen () const { return Circulo::area() * altura; } void Cilindro :: mostrar () const { ????? void Cilindro::setAltura(double h) { altura=(h >=0 ? h :0);} double Cilindro::daAltura() const { return altura;

1O

19.3 Herencia prctica


/jemplo
Cilindro ci1 (5.7, 2.5, 12, 23); // Usamos metodos heredados... cout<<"x es "<<ci1.getX()<< endl; cout<<"y es "<<ci1.getY()<< endl; cout<<r es << ci1.getRadio()<<endl; cout<<h es << ci1.daAltura()<<endl; // Usamos mtodos no constantes. ci1.setAltura(10); ci1.setRadio(4.25); ci1.setPunto(2,2); cout << "Los datos de ci1 son: \n"; ci1.mostrar(); Point & pRef =ci1; //pRef "piensa" que es un punto pRef.mostrar(); Circulo & cRef =ci1; //cRef "piensa" que es un circulo cRef.mostrar();

-Q

19.3 Herencia prctica


/jercicio 1.- Implementar esta jerarqua de clases sabiendo que todas las clases muestran por pantalla cuando se llama a su constructor por defecto y a su destructor. Cul es la salida del programa con ese main()?. Implementar mostrar() en todas las clases.
Motor
composicin

Rueda

Coche Navegador

composicin 4

int main() { Lamborgini l; l.mostrar(); }

composicin

Herencia

Lamborgini

-1

You might also like