Sei sulla pagina 1di 21

DcimonovenaSesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Herencia III
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

19.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. La herencia nos permite: Crear nuevas clases a partir de clases existentes. Conservando las propiedades de la clase original. Aadir nuevos mtodos y atributos a la clase original. Redefinir comportamiento de mtodos.

19.1Repaso
Herencia 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.

19.1Repaso
Control de Acceso en la Herencia class <clase_derivada> : [public|private] <base1> [,[public|private] <base2>] {};
Persona

Alumno

TipodeDatoClaseBase Private Protected Public

Herenciaconpublic Herenciaconprivate Otros NoaccesibledirectamenteNoaccesibledirectamenteNoaccesible Protected Private Noaccesible Public Private Accesible(.>)

19.1Repaso
Hay Miembros que no se heredan automticamente La clase derivada hereda todos los atributos y todos los mtodos, excepto: Constructores Destructor Operador de asignacin Constructores y destructor: Si en la subclase no estn definidos, se crea un constructor por defecto y un destructor, aunque sin que hagan nada en concreto. Operador de asignacin: Si en la subclase no est definido, se crea uno el operador de asignacin de la superclase. por defecto que se basa en

MORALEJA Se deben crear los constructores y el destructor en la subclase. Se debe definir el operador de asignacin en la subclase.

19.1Repaso
Orden de llamada
Constructor de la Clase Base Destructor de la Clase Derivada
operator= Clase Derivada

Constructor de la Clase Derivada Destructor de la Clase Base

FIN

FIN

Existe? NO operator= Clase Base

SI

FIN

Existe?

SI

NO

Copia Bit a Bit

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

Qu mtodo se ejecuta? b16s18.2 b27s2f b34 b10s10 b20s2h b30

b10s18.2 b20s2f b30 ClaseBase::operator=(d);


8

19.1Repaso
Pasos de Mensaje con Herencia Ejercicio: alum.mostrar(); alum.felizcumple(); alum.matricular();
Buscamos mtodo en la clase

Existe? NO SI Buscamos en la primera Superclase

SI

FIN

Hay ms Clases en la jerarqua?

Existe? NO

SI

NO

ERROR 9

19.1Repaso
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.

10

19.2Herencia
Superposicin y Sobrecarga Ya hemos visto que puedo redefinir un mtodo de una clase base en mi nueva clase derivada. Superponemos el nuevo mtodo sobre el existente. Cuando de superpone una funcin, se ocultan todas las funciones con el mismo nombre en la clase base. No accedemos a ninguna de las funciones superpuestas de la clase base, aunque tengan distinto nmero de parmetros, o stos o el valor de retorno tengan distintos tipos. Para acceder a los mtodos de la clase base estaremos obligados a utilizar el nombre completo. ClaseBase::metodo_que_sea(....);
11

19.2Herencia
Superposicin por redefinicin en la Herencia
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; }

12

19.2Herencia
Superposicin y Sobrecarga Lo ms frecuente es que la versin de la clase derivada llame a la versin de la clase base. La versin de la clase base hace su parte de la nueva tarea. En el caso de Alumno: Llamo a mostrar() de Persona y luego muestro las notas. Alumno::mostrar(void) { Persona::mostrar(); cout<<Nota:<<nota_<<endl; } Qu ocurre si no utilizamos el operador de resolucin de mbito (::)? Recursin Infinita!!
13

19.2Herencia
Conversin entre Objetos Un objeto de la clase base tambin ES UN objeto de la clase derivada. Pero: el tipo de la clase base y el tipo de la clase derivada son distintos. Bajo herencia public: Los objetos de la clase derivada se pueden tratar como si fueran de la base. La clase derivada tiene miembros que se corresponden con los de la base. Convertir de derivada a base es correcto y tiene sentido. No al revs. Si tenemos un puntero de la clase base apuntando a un objeto de la clase derivada: El puntero de la clase base slo ve la parte de la clase base. Alumno a; Persona p; ..... p = a; a = p; // No!!

14

19.2Herencia
Clases Abstractas Una clase Abstracta es aquella que solo sirve como base de otras clases. No se puede crear objetos de esa clase (no se debe). Normalmente se trata de clases que representan conceptos abstractos de los que no tiene sentido crear objetos. No tiene sentido trabajar con figuras o paralelogramos. Modela comportamiento comn. Implementa Mtodos comunes.
Paralelogramo Figura

Elipse

Rectngulo

Trapecio

Crculo

Establece mtodos comunes y obliga a que se implementen en las derivadas.


15

19.2Herencia
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).

La herencia significa: Esta nueva clase que estoy creando es un tipo de esta clase antigua

16

19.3HerenciaPrctica
Ejemplo
classPunto { protected: intx; inty; public: Punto(inta=0,b=0); voidsetPunto(int,int); intgetX()const{returnx;}; intgetY()const{returny;}; voidmostrar()const; }; Punto::Punto(inta,intb) { setPunto(a,b); } voidPunto::setPunto(inta,intb) { x=a; y=b; } voidPunto::mostrar() { cout<<"["<<p.x<<","<<p.y<<"]"; cout<<endl; } UsodePunto Puntop(72,115); cout<<Lacoordenadadexes <<p.getX()<<endl; cout<<Lacoordenadadeyes <<p.getY()<<endl; //Nopuedo: //cout<<Xes:<<p.x<<endl; p.mostrar();

17

19.3Herenciaprctica
Ejemplo
classCirculo:publicPunto { protected: doubleradio; public: Circulo(doubler=0.0,intx=0, inty=0); voidsetRadio(double); doublegetRadio()const; doublearea()const; voidmostrar()const; }; Circulo::Circulo(doubler,inta,int b):Punto(a,b) { setRadio(r); } voidCirculo::setRadio(doubler) { radio=(r>=0?r:0); } doubleCirculo::getRadio()const { returnradio; } doubleCirculo::area()const { return3.14159*radio*radio; } voidCirculo::mostrar()const { Punto::mostrar(); cout<<Radio=<<radio<<endl; }

18

19.3Herenciaprctica
Ejemplo
classCilindro:publicCirculo { protected: doublealtura; public: Cilindro(doubleh=0.0, doubler=0.0,intx=0,inty=0); voidsetAltura(double); doubledaAltura()const; doublearea()const; doublevolumen()const; voidmostrar()const; } Cilindro::Cilindro(doubleh,double r,intx,inty):Circulo(r,x,y) { setAltura(h); } voidCilindro::setAltura(doubleh) {altura=(h>=0?h:0);} doubleCilindro::daAltura()const { returnaltura; } doubleCilindro::area()const { return2*Circulo::area()+2*3.14159 *radio*altura; } doubleCilindro::volumen()const { returnCirculo::area()*altura; } voidCilindro::mostrar()const { ????? }

19

19.3Herenciaprctica
Ejemplo
Cilindroci1(5.7,2.5,12,23); //Usamosmetodosheredados... cout<<"xes"<<ci1.getX()<<endl; cout<<"yes"<<ci1.getY()<<endl; cout<<res<<ci1.getRadio()<<endl; cout<<hes<<ci1.daAltura()<<endl; //Usamosmtodosnoconstantes. ci1.setAltura(10); ci1.setRadio(4.25); ci1.setPunto(2,2); cout<<"Losdatosdeci1son:\n"; ci1.mostrar(); Point&pRef=ci1; //pRef"piensa"queesunpunto pRef.mostrar(); Circulo&cRef=ci1; //cRef"piensa"queesuncirculo cRef.mostrar();

20

19.3Herenciaprctica

Ejercicio 1.Implementarestajerarquadeclasessabiendoquetodaslas clasesmuestranporpantallacuandosellamaasuconstructorpor defectoyasudestructor.Culeslasalidadelprogramacon esemain()?.Implementarmostrar()entodaslasclases.


Motor
composicin

Rueda

Coche Navegador

composicin 4

intmain() { Lamborginil; l.mostrar(); }

composicin

Herencia

Lamborgini

21

Potrebbero piacerti anche