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

Decimosptima Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

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

Polimor-ismo
$unciones +irtuales Polimor-ismo So!recarga)

Plantillas

Contenedores

Iteradores

17.1 Conceptos Vistos


Conceptos Previos El concepto -undamental en la reutili/acin) *odo lo 0ue 1emos 2isto 2a encaminado a poder proramar de -orma ms e-iciente3 4 Me"oramos nuestra capacidad para anali/ar un pro!lema) 4 Podemos !asarnos en cdigo 1ec1o 5 pro!ado6) 4 Reutili/o cdigo o ideas anteriores) Ecapsulamiento3 4 Oculto comple"idad 0ue no interesa como cliente de una clase) 4 Impido el acceso directo a los mecanismos internos) Las clases 2ienen a con mecanismos para iniciali/ar o -inali/ar) Puedo so!recargar contructores o -unciones o m7todos) Puedo so!recargar 1asta los operadores) #n cdigo ms legi!le tam!i7n es ms reutili/a!le)
8

17.2 Herencia
erencia y Composicin 9ecesitamos algo ms 0ue copiar cdigo reutili/arlo para 0ue la programacin orientada a o!"eto sea algo Re2olucionario) +eremos cmo reutili/ar cdigo creando nue2as clases: pero en lugar de 1acerlo desde cero nos !asaremos en clases 0ue alguien 1a implementado pro!ado con anterioridad) Composicin3 Creamos o!"etos de la clase e;istente dentro de la nue2a clase 0ue estamos creando) La nue2a clase est! comp"esta por o!"etos de clases e;istentes) erencia3 Se toma la -orma de la clase e;istente se a<ade cdigo sin modi-icar la clase e;istente) La nue2a clase se crea como "n tipo de la e;istente) Casi todo el tra!a"o lo reali/a el compilador) La 1erencia es uno de los pilares -undamentales de la POO)
=

17.2 Herencia
#inta$is de la Composicin El concepto de composicin a lo 1emos estado usando) 9uestras clases conten>an atri!utos: 0ue era de los tipos prede-inidos)
class Coche { private: Rueda Motor public: Rueda(): motor_(0), dir_(0) {}; arrancar() { motor_.encender(); dir_.centrar(); } } } a_[4]; motor_; c1.arrancar(); // Bien. int main() { Coche c1;

Direccion dir_; c1.a_[0].inflar(); // Mal. Privado

17.2 Herencia
erencia La 1erencia es una propiedad de la Programacin Orientada a O!"eto) 9os permite3 Crear nue2as clases a partir de clases e;istentes) Conser2ando las propiedades de la clase original) %<adir nue2os m7todos atri!utos a la clase original) La nue2a clase o!tenida se conoce como clase derivada: las clases a partir de las cuales se deri2a: clases base) #na clase deri2ada puede a su 2e/ ser2ir de !ase para otra clase di-erente) Cuando una clase deri2a de ms de una clase !ase3 Herencia M,ltiple) Este tipo de relaciones nos permite crear @erar0u>as de Clases) Las "erar0u>as de clases se usan especialmente en la resolucin de pro!lemas comple"os: es di->cil 0ue tengamos 0ue recurrir a ellas para resol2er pro!lemas sencillos)
A

17.2 Herencia
%C"!ndo "tili&ar la 'erencia( 1) Cuando 1a su-icientes similitudes) *odas las caracter>sticas de la clase e;istente o la ma or>a de ellas: son adecuadas para la nue2a clase)

.) En la nue2a clase se ampliar /o rede-inir el con"unto de caracter>sticas)

La nue2a clase de-inida a partir de la clase e;istente: adopta todos los miem!ros de la clase e;istente3 4 atri!utos 4 m7todos

17.2 Herencia
)erar*"as de Clases Las clases !ases son las ms gen7ricas) +amos especiali/ando seg,n deri2amos) +Clasi,icamosPersona 9om!re: %pellidos: (9I

Sueldo

Empleado

9ota

%lumno

Clases

Pro-esor

%dministrati2o

PC $i"o

17.2 Herencia
)erar*"as de Clases Cada 2e/ 0ue creamos un o!"eto de la clase %dministrati2o estamos creando adems un o!"eto Empleado un o!"eto Persona) Siempre podemos e;tender nuestra "erar0u>a) Si tenemos una clase Decario 0ue no es ni un Estudiante ni un Empleado podemos deri2arlo directamente de persona) Si consideramos 0ue es un Estudiante adems un Empleado podemos deri2arlo de los dos3 erencia M.ltiple/ Podemos aplicar procedimientos genricos a una clase concreta) Su!ida de sueldo general a todos los empleados independientemente de su puesto principal)
Persona

Empleado

%lumno

Pro-esor

%dministrati2o

17.2 Herencia
#inta$is de la erencia en C++ class FclaseGderi2adaH 3 Ipu!licJpri2ateK F!ase1H I:Ipu!licJpri2ateK F!ase.HK LMN class %lumnoM. 3 pu!lic %lumno L )))) )))) M class ClaseGderi2ada 3 pu!lic pri2ate ClaseGDase

1O

17.2 Herencia
0jemplo de
class Persona { private: char * nif; int edad; char * nombre, *apellidos; public: Persona(char*,int=0,char*,char*); Persona & operator=(Persona &); ~Persona(); void medad(int); void mnombre(char *); char * mnombre() ; void mostrar() ; char * nombreCompleto() ; void felizCumple(); void leer(); };

erencia Si 0ueremos un %lumno: sa!iendo 0ue contamos con la clase Persona) Los alumnos tienen 9I$: nom!re: apellidos edad) Los atrib"tos de Persona nos 2alen para %lumno) Los mtodos de Persona nos 2alen para %lumno)

11

17.2 Herencia
0jemplo de erencia crear una nue2a clase Resulta adecuado aplicar el mecanismo de 1erencia %lumno a partir de la clase a e;istente Persona)

1os al"mnos son personas


Clase !ase3 La clase !ase es la clase a creada: de la 0ue se 1ereda) *am!i7n se la denomina clase madre o superclase) Clase deri2ada3 es la clase 0ue se crea a partir de la clase !ase) Se dice 0ue es la clase 0ue 1ereda) *am!i7n se la denomina clase 1i"a o su!clase)
Persona

La clase Persona es la clase !ase La clase %lumno es la clase deri2ada)

Empleado

%lumno

Pro-esor

%dministrati2o

1.

17.2 Herencia
Clase 2ase y Clase 3erivada La clase deri2ada 1ereda todas las caracter>sticas de la clase !ase) La clase deri2ada puede de-inir caracter>sticas adicionales) La clase deri2ada puede rede-inir caracter>sticas 1eredaras de la clase !ase) La clase deri2ada puede anular caracter>sticas 1eredadas de la clase !ase) El proceso de 1erencia no a-ecta a la clase !asePP
Clase Dase
Persona

Empleado

%lumno

Clase (eri2ada
Pro-esor %dministrati2o

18

17.2 Herencia
Clase 2ase y Clase 3erivada La clase deri2ada3 QQ 9o puede acceder a los miem!ros pri2ados de la clase Dase PP Las -unciones miem!ros o m7todos de %lumno no se tiene acceso a los atri!utos pri2ados de Persona) 9o podemos 1acer esto3 %lumno33pasarGcurso56 L )))))) edadG R edad + 1N ))))))) M +iolar>a las normas de encapsulamiento)
1= %lumno Persona

17.2 Herencia
Control de 4cceso en la erencia class FclaseGderi2adaH 3 Ipu!licJpri2ateK F!ase1H I:Ipu!licJpri2ateK F!ase.HK LMN

Persona

%lumno

Para cada clase !ase podemos de-inir dos tipos de acceso: pu!lic o pri2ate) Si no se especi-ica ninguno de los dos: por de-ecto se asume 0ue es pri2ate) p"blic3 los miem!ros 1eredados de la clase !ase conser2an el tipo de acceso con 0ue 0ue -ueron declarados en ella) private3 todos los miem!ros 1eredados de la clase !ase pasan a ser miem!ros 0ue pri2ados en la clase deri2ada) (entro de la clase podemos declarar nuestros atri!utos m7todos como3 p"blic3 Se puede acceder a ellos desde -uera de la clase) private3 9o se puede acceder a ellos desde -uera) protected3 9o se puede acceder a ellos a no ser 0ue sea una clase deri2ada)
1?

17.2 Herencia
Control de 4cceso en la erencia class FclaseGderi2adaH 3 Ipu!licJpri2ateK F!ase1H I:Ipu!licJpri2ateK F!ase.HK LMN
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 (. ->)

1A

17.2 Herencia
0jemplo de control de acceso en la
class ClaseBase { private: int b1 ; int b2 ; public: int b3 ; void metodo_base1 (int a); void metodo_base2 (); }; class ClaseDerivada : public ClaseBase { private: float s1 ; char s2 ; public: float metodo_deriv1 (); void metodo_deriv2 (char x); }; - s1 - s2 + b3 + metodo_deriv1 + metodo_deriv2 - b1 - b2 + b3 + metodo_base1 + metodo_base2

erencia
ClaseDase

Clase(eri2ada

1B

17.2 Herencia
0jemplo de control de acceso en la
class ClaseBase { private: int b1 ; int b2 ; public: int b3 ; void metodo_base1 (int a); void metodo_base2 (); }; class ClaseDerivada : public ClaseBase { private: float s1 ; char s2 ; public: float metodo_deriv1 (); void metodo_deriv2 (char x); };

erencia #tilicemos o!"etos de las clases como 1emos 1ec1o 1asta a1ora3 ClaseBase objb1, objb2; ClaseDerivada oder1, oder2; objb1.metodo_base2( ); objb2.b3 = 8; cout <<oder1.metodo_deriv (); oder2.metodo_base2( ); oder1.b3 = 5; oder1.b1 = 7; //error? %l 1eredar: desde la Clase(eri2ada tampoco se se tiene acceso a los miem!ros pri2ados de ClaseDase 3 !1 !.
1C

17.2 Herencia
0jemplo de control de acceso en la
class ClaseBase { public: int b1 ; int b2 ; int b3 ; void metodo_base1 (int a); void metodo_base2 (); }; class ClaseDerivada : public ClaseBase { private: float s1 ; char s2 ; public: float metodo_deriv1 (); void metodo_deriv2 (char x); };

erencia Si 0ueremos acceder desde la clase deri2ada podemos declarar !1 !. tam!i7n como p,!licos) Mal asunto3 *am!i7n se puede acceder desde cual0uier lado de cual0iuer programa3 QQPerdemos el EncapsulamientoPP

1E

17.2 Herencia
0jemplo de control de acceso en la
class ClaseBase { protected: int b1 ; int b2 ; public: int b3 ; void metodo_base1 (int a); void metodo_base2 (); }; class ClaseDerivada : public ClaseBase { private: float s1 ; char s2 ; public: float metodo_deriv1 (); void metodo_deriv2 (char x); }; # b1 # b2 + b3 + metodo_base1 + metodo_base2

erencia Protected5 Cali-icador 0ue permite acceso desde las clase deri2adas)
ClaseDase

void { s1 s2 b1 b3 }

metodo_deriv2(char x) = = = = 3.6; x; 4; // Ahora s!! 2;


.O

17.2 Herencia
6es.men de Control de 4cceso en la erencia class FclaseGderi2adaH 3 Ipu!licJpri2ateK F!ase1H I:Ipu!licJpri2ateK F!ase.HK LMN Los miem!ros de una clase pueden ser3
Persona

%lumno

private5 Miem!ros pri2ados) Protegidos de todo acceso -uera del m!ito de la clase) protected5 Miem!ros protegidos) Protegidos de todo acceso -uera del m!ito de su clase o de sus clases deri2adas) p"blic5 Miem!ros p,!licos) %ccesi!les desde cual0uier m!ito)

.1

17.2 Herencia
Modo de 3erivacin P.blico class FclaseGderi2adaH 3 pu!lic FclaseG!aseH LMN Los miem!ros 1eredados mantienen su modo de acceso3 Los 0ue son p,!licos en la superclase: siguen siendo p,!licos en la su!clase por tanto accesi!les) Los 0ue son pri2ados en la superclase: siguen siendo pri2ados en la su!clase e inaccesi!les) En las -unciones miem!ro de la su!clase no se tiene acceso a los miem!ros pri2ados 1eredados)
Persona

%lumno ..

17.2 Herencia
Modo de 3erivacin Privado class FclaseGderi2adaH 3 Ipri2ateK FclaseG!aseH LMN Los miem!ros 1eredados se con2ierten en pri2ados3 Los 0ue son p,!licos en la superclase: pasan a ser pri2ados en la su!clase: pero son accesi!les en la su!clase) Los 0ue son pri2ados en la superclase: siguen siendo pri2ados en la su!clase e inaccesi!les) En las -unciones miem!ro de la su!clase no se tiene acceso a los miem!ros pri2ados 1eredados: pero s> a los miem!ros p,!licos 1eredados: aun0ue se 1a an con2ertido en pri2ados) % los o!"etos de la su!clase: 9O se les puede en2iar mensa"es 0ue correspondan a m7todos p,!licos 1eredados 5se 1an con2ertido en pri2ados6)
Persona

%lumno .8

17.2 Herencia
Modo de 3erivacin P.blico
class Persona { private: // miembros privados public: // miembros pblicos }; }; class Alumno : public Persona { private: ... public: .

La clase %lumno incorpora los miem!ros pri2ados de Persona) Los miem!ros pri2ados 1eredados siguen siendo pri2ados) La clase %lumno incorpora los miem!ros p,!licos de Persona) Los miem!ros p,!licos 1eredados siguen siendo p,!licos) Las -unciones miem!ro 0ue se de-inan en la clase alumno: no podrn acceder a los miem!ros pri2ados 1eredados)
.=

17.2 Herencia
Modo de 3erivacin Privado
class Persona { private: // miembros privados public: // miembros pblicos }; }; class Alumno : private Persona { private: ... public: .

*odos los miem!ros pri2ados

p,!licos 1eredados pasan a ser pri2ados3

Los miem!ros pri2ados 1eredados3 privados y 7o accesibles Los miem!ros p,!licos 1eredados3 privados pero accesibles/

.?

17.2 Herencia
0jemplo derivacin o 'erencia p.blica
class Persona { private: char * nif; int edad; char * nombre, *apellidos; public: Persona(char*,int=0,char*,char*); ...... char * mnombre() ; void mostrar() ; ..... void leer(); };

Privado en 4l"mno Inaccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

P.blico en 4l"mno %ccesi!le desde sus -unciones miem!ro) %ccesi!le desde -uera)

class Alumno: public Persona {...};


.A

17.2 Herencia
0jemplo derivacin o 'erencia p.blica (protected)
class Persona { protected: char * nif; int edad; char * nombre, *apellidos; public: Persona(char*,int=0,char*,char*); ...... char * mnombre() ; void mostrar() ; ..... void leer(); };

Protegido en 4l"mno %ccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

P.blico en 4l"mno %ccesi!le desde sus -unciones miem!ro) %ccesi!le desde -uera)

class Alumno: public Persona {...};


.B

17.2 Herencia
0jemplo derivacin o 'erencia privada
class Persona { private: char * nif; int edad; char * nombre, *apellidos; public: Persona(char*,int=0,char*,char*); ...... char * mnombre() ; void mostrar() ; ..... void leer(); };

Privado en 4l"mno Inaccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

Privado en 4l"mno %ccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

class Alumno: private Persona {...};


.C

17.2 Herencia
0jemplo derivacin o 'erencia privada (protected)
class Persona { protected: char * nif; int edad; char * nombre, *apellidos; public: Persona(char*,int=0,char*,char*); ...... char * mnombre() ; void mostrar() ; ..... void leer(); };

Protegido en 4l"mno %ccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

Privado en 4l"mno %ccesi!le desde sus -unciones miem!ro) Inaccesi!le desde -uera)

class Alumno: private Persona {...};


.E

Вам также может понравиться