Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CPP Herencia PDF
CPP Herencia PDF
1
Sustitucin de mtodos Herencia Mltiple
class D: public B { };
Clase D puede reutilizar, extender o crear su
Hereda de varias clases a la vez.
propia definicin de mtodo M de B
cuad: public rect, public poly
Para sustituir la implementacin de M de B, {... };
lo define de nuevo Es complejo y ambiguo. Un mtodo puede
Si lo extiende, estar definido en varias clases padre.
desde M de D puede invocar M de B Luego lo ampliaremos, aunque debe evitarse.
Pero usando el operador de mbito B::M
Si desea reutilizarlo no debe hacer nada.
Curso de programacin de C/C++ 63 Curso de programacin de C/C++ 64
Un D es un B, pero un B no es un D Un D es un B, pero un B no es un D
Las aplicaciones trabajan con B, D1, D2, ... Trabajando con punteros o referencias a objetos
Comportamiento cambia si se usan punteros o no B *pB = &objB; // OK; trivial
Trabajando directamente con objetos D *pD = &objD; // OK; trivial
Asignar objeto B a D da error de compilacin D *pD = &objB; // error de compilacin: B no es D
objeto B no es D B *pB = &objD; // OK: objeto D es de la clase B
Asignar objeto D a B OK pero se produce slicing Otro ejemplo de uso de punteros a objetos
En la copia se pierde toda la info. del objeto asociada a
clase D B *pB = &objD;
En la mayora de los casos, no es lo que pretenda el D *pD = pB; // error de compilacin, pero correcto
programador // uso de dynamic_cast
2
Invocacin de mtodos Invocacin de mtodos
B tiene mtodos M1 y M2 B *pX = &objD;
D derivada de B redefine/sustituye M2 Comportamiento extrao: pX->M2(...) debera
Ejemplos de invocacin a travs de punteros: ejecutar M2 de D
D *pD = &objD; B *pB = &objB; B *pX = &objD; Resultado de invocar mtodo depende de puntero
pD->M1(...); // M1 de B Si lista de punteros a B que contiene objetos
pD->M2(...); // M2 de D; CASO 1 derivados de B: D1,D2...
pB->M1(...); // M1 de B Comportamiento razonable: ejecuta M2 de derivado
pB->M2(...); // M2 de B polimorfismo
pX->M1(...); // M1 de B
pX->M2(...); // M2 de B; CASO 2CASO1 SORPRESA?
Curso de programacin de C/C++ 69 Curso de programacin de C/C++ 70
3
Destructores Virtuales Destructores virtuales
Necesidad de incluir destructor virtual en clase base
Los destructores pueden ser virtuales polimrfica: virtual ~C() { }
virtual ~forma(); Incluso aunque clase B no tenga nada que destruir
Puede (o podr) haber clases derivadas que tengan que hacerlo
Ejemplo en que es necesario:
forma * lista[MAX]; Si no destructor virtual, problema al destruir objeto
lista[0] = new rectangulo(); mediante B*
lista[1] = new circulo(); Se invoca el destructor de B en vez del destructor de D
.... Los constructores no pueden ser virtuales
for (i=0; i<MAX; i++)
Si se necesita una funcionalidad de ese tipo hay que programarla
delete lista[i];
Constructores virtuales
Clases abstractas
A menudo, no tiene sentido crear objetos de una Clases Abstractas
cierta clase base: Clase Abstracta
Ejemplo
La clase no est concebida como un molde para crear forma F; //NO.
objetos, es un contenedor de funcionalidad comn forma *F; //SI
Clase abstracta: tiene funciones virtuales puras Las referencias tambin son vlidas.
virtual void imprimir() = 0; func(forma &F)
Derivada debe implementar todas las FVPs {F.area(); //SI}
Main() {
Sino ser tambin abstracta
cuadrado cuad;
Clase abstracta con slo FVPs define una interfaz func(cuad);...
Clases derivadas slo heredan interfaz
Curso de programacin de C/C++ 79 Curso de programacin de C/C++ 80
4
Tipos de herencia Tipos de herencia
Segn el grado de funcionalidad que se hereda
Reutilizacin de cdigo Herencia de la implementacin
Tambin se puede lograr mediante composicin Ms orientada hacia la reutilizacin
En vez de D es un B, D contiene un miembro de datos B Herencia de la interfaz
Aspecto con cierta polmica: Mejor como atributos Ms orientada hacia el polimorfismo
Control de acceso:
Tipos de herencia Recapitulacin funciones miembro
Lenguaje C++:
No distingue entre herencia de implementacin y de
Clase B Abstracta con funciones miembro
interfaz. Debe hacerlo el programador M1(FNV), M2 (FV) y M3 (FVP)
Proporciona herencia mltiple pB (tipo B*) apunta a objeto de clase D
Java Accin asociada a pBMX():
Distingue entre herencia de implementacin y de M1 no sustituido por D: Invoca M1 de B
interfaz M1 sustituido por D: Invoca M1 de B
Provee herencia simple de implementacin y M2 no sustituido por D: Invoca M2 de B
mltiple de interfaz M2 sustituido por D: Invoca M2 de D
M3 no sustituido por D: No factible
M3 sustituido por D: Invoca M3 de D
Curso de programacin de C/C++ 83 Curso de programacin de C/C++ 84
5
Herencia privada
Derivadas de D no pueden acceder ni a mtodos
Herencia protegida
pblicos de B class D: protected B { };
Es como si B fuera un miembro de datos Igual que privada pero:
privado de D Derivadas de D pueden acceder a m. pblicos y
D no es un B, D est implementado basndose protegidos de B
en B Es como si B fuera un miembro de datos
Similar a composicin protegido de D
No hay polimorfismo para usuarios de clase B y
derivadas:
B* pB = &objD; // Error
6
Clases bases replicadas Clase base virtual
class D1: public B {...}; Pero en otros caso no: Empleado (B)
incluye nombre y apellidos
class D2: public B {...};
Ayudante (D1), Temporal (D2),
class DD: public D1, public D2 {...}; AyudanteTemporal (DD)
No queremos que aparezcan 2 veces los B
B B
La clase B est duplicada en clase DD nombres y apellidos
Si tiene un miembro de datos privado, Herencia virtual D1 D2
D1 D2
aparecer 2 veces class D1: public virtual B {...};
En algunos casos es lo que se pretende class D2: public virtual B {...};
DD DD
class DD: public D1, public D2 {...};
Curso de programacin de C/C++ 93 Curso de programacin de C/C++ 94