Professional Documents
Culture Documents
Herencia III
1
So recarga
'e Operadores Creacin 'inmica de O !etos
Herencia(
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
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
#IF
#IF
SI
#IF
E0isteH
SI
FO
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;
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
SI
#IF
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 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
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
1E
1J
1O
-Q
Rueda
Coche Navegador
composicin 4
composicin
Herencia
Lamborgini
-1