Informática II
Clase 11: Herencia Avanzada
1Diego Fernando Serna Restrepo Semestre 2011/2
Informática II 2011/22
CHISTE DEL DÍA
3
CONTENIDO
Informática II 2011/2
Contención1
Delegación2
3
4
Herencia privada
Clases y funciones amigas
4
CONTENCIÓN
Informática II 2011/2
• Una clase o estructura en C++ es capaz de contener cualquier otro tipo de datos, inclusive otras clases o estructuras
class Empleado{Telefono numTel;Nombre Nombre;
}
class Telefono{int tel;
}
class Nombre{char *name;
}
Un objeto instanciado de una clase, es declarado como miembro de otra.
Informática II 2011/25
CONTENCIÓN EN C++
5
class Carro { public: Motor suMotor; Fabricante suMarca; Color suColor; Propietario suDuenio;}
class Motor { public: … private: …}
class Fabricante { public: … private: …}
class Propietario { public: … private: …}
Se dice que la clase contiene miembros de otras clases
class Color { public: … private: …}
Informática II 2011/26
1
Es posible acceder a estas clases miembro y a su vez a sus variables y
métodos miembro mediante los operadores (.) (->) según sea el caso.
2De este modo se puede
construir una nueva clase a partir de otra sin el uso
de herencia.
CONTENCIÓN
Informática II 2011/27
EL COSTO DE LA CONTENCIÓN
Copiando por valor
Cuando se pasan objetos de la clase por valor a una función esto provoca mayor número de llamadas al
constructor al crear copias de dicho objeto.
Es importante notar que el uso de la clase Empleado debe pagar el precio del llamado al constructor de las
clases Telefono, y Nombre y los respectivos espacios en memoria de sus variables miembro. Esto se hace evidente cada vez que se instancie un objeto tipo Empleado o cuando se haga una copia de este.
8
CONTENIDO
Informática II 2011/2
Contención1
Delegación2
3
4
Herencia privada
Clases y funciones amigas
Informática II 2011/29
DELEGACIÓN
La delegación
Método para otorgar funcionalidades a las clases, a partir de otras clases.
Se puede llevar a cabo
Al contener clases que le otorguen la funcionalidad
requerida
Heredar dichas funciones de otra clase base.
Informática II 2011/210
CONTENCIÓN HERENCIA
Informática II 2011/211
HERENCIA O CONTENCIÓN?
• Contenido. Un objeto declarado como miembro de otra clase, contenido por esa clase.
• Delegación. Uso de los atributos de una clase contenida para llevar a cabo funciones no disponibles para la clase que contiene.
• Implementar en terminos de. construcción de una clase utulizando las capacidades de otra sin usar la herencia pública.
Informática II 2011/212
HERENCIA O CONTENCIÓN?
Existe algún miembro de la clase base que no debería estar en la clase derivada?
R/= Si, entonces no hay lugar a usar herencia pública.
¿La clase que usted esta creando, debe usar varias clases del mismo tipo para realizar su trabajo?
R/= Si, entonces será necesario el uso de contención.
Informática II 2011/213
HERENCIA O CONTENCIÓN?
Será necesario heredar de una clase base para poder tomar ventaja de sus
métodos virtuales y miembros privados?
R/= Si, entonces tanto la herencia pública como la privada puede dar
solución a este escenario.
14
CONTENIDO
Informática II 2011/2
Contención1
Delegación2
3
4
Herencia privada
Clases y funciones amigas
Informática II 2011/215
HERENCIA PUBLICA
• Con este tipo de herencia se respetan los comportamientos originales de las visibilidades de la clase Base en la clase Derivada.
• class Derivada: public Base
Herencia pública:
Informática II 2011/216
HERENCIA PROTEGIDA
• Con este tipo de herencia, todo componente público y protegido de la clase Base, será protegido en la clase Derivada, y los componentes privados, siguen siendo privados.
• class Derivada: protected Base
Herencia protegida
Todas las funciones públicas en la clase base pasana ser protegidas en la clase derivada
Informática II 2011/217
HERENCIA PRIVADA
• Con este tipo de herencia todo componente de la clase Base, será privado en la clase Derivada (las propiedades heredadas serán privadas aunque estas sean públicas en la clase Base)
• class Derivada: private Base
Herencia privada:
• La herencia privada te da acceso a los miembros protegidos de la clase base
No siempre se desea dejar expuesta las funcionalidades o variables miembro de una clase base dentro de una clase derivada
Informática II 2011/218
HERENCIA PRIVADA
• Es usada si se desea ocultar parte de la funcionalidad de la clase base
• Cuando se hereda de manera privada, todos los miembros públicos de la clase base se vuelven privados, si se desean que sea visibles, se debe colocar el nombre del método (sin valor de retorno o parámetros de entrada) en la sección pública de la clase derivada.
class Base1 {public: char f() const { return 'a'; } int g() const { return 2; } float h() const { return 3.0; }};
class Derived : Base1 { // Private inheritancepublic: Base1::f; // Name publicizes member Base1::h;};
int main() { Derived d; d.f(); d.h(); d.g(); }
Informática II 2011/219
HERENCIA PRIVADA
• Se dice que una clase esta implementada en términos de otra clase (oculta parte de la funcionalidad de la clase base)
• Los que son públicos en la superclase, pasan a ser privados en la subclase, pero son accesibles en la subclase.
• Los que son privados en la superclase, siguen siendo privados en la subclase e inaccesibles.
• En las funciones miembro de la subclase no se tiene acceso a los miembros privados heredados, pero sí a los miembros públicos heredados, aunque se hayan convertido en privados.
20
CONTENIDO
Informática II 2011/2
Contención1
Delegación2
3
4
Herencia privada
Clases y funciones amigas
Informática II 2011/221
ACCEDIENDO A LOS ATRIBUTOS PRIVADOS
Informática II21
class Punto { public: float x; float y; Punto(); Show();}
class Punto { private: float x; float y; public: Punto(); Show(); float getX(){return x;} float getY(){return y;}}
float Distancia(Punto p1, Punto p2) { float dx, dy; dx = p1.x – p2.x; dy = p1.y – p2.y; return sqrt(dx*dx + dy*dy)}
float Distancia(Punto p1, Punto p2) { float dx, dy; dx = p1.getX() – p2.getX(); dy = p1.getY() – p2.getY(); return sqrt(dx*dx + dy*dy)}
Informática II 2011/222
CLASES Y FUNCIONES AMIGAS
• Se ha visto que todos aquellos miembros de una clase que sean declarados protegidos o privados, no podrán ser accedidos directamente desde el exterior de la clase.
• Existen ocasiones en que se desea que una clase pueda acceder directamente a los miembros privados de otra, en estos casos es posible declarar a la función/clase que se desea compartir como amiga.
class Clase1{public:friend class Clase2; // Clase 2 será amiga de clase 1,
// por lo tanto podrá acceder a // todos los miembros de Clase 1// directamente
}class Clase2{...}
La declaración de la clase amiga no es bidireccional
Informática II 2011/223
• No siempre se desea declarar todos los miembros de una clase como “amigas”. En estos casos será posible declararlas explícitamente.
CLASES Y FUNCIONES AMIGAS
class ParteNodo{
// Haciendo que otra función miembro sea amigafriend void ListaParte::Insertar(Parte *);
// Haciendo amiga a una función globalfriend int AlgunaFuncion();//....}
Informática II 2011/224
FUNCIONES AMIGAS
• La implementación de la función Distancia, no hace uso del operador de ámbito (::).– Porque??
• La función es amiga de Punto, pero no pertenece a la clase.
• Las funciones amigas no contienen el argumento implícito this.
• Una función puede ser amiga de una clase y miembro de otra.24
class Punto { private: float x; float y; public: Punto(); Show(); float getX(){return x;} float getY(){return y;} friend float Distancia(Punto, Punto);}
float Distancia(Punto p1, Punto p2){ float dx, dy; dx = p1.x – p2.x; dy = p1.y – p2.y; return sqrt(dx*dx + dy*dy)}
Informática II 2011/225
PROBLEMAS DE SEGURIDAD??• Uno de los pilares de la POO es la
ocultación de la información.– ¿Proveen entonces las funciones amigas una
puerta trasera para burlar la ocultación de la información?.
• ¿Como se preserva esto?.– Es la clase la que dice quiénes son sus amigos
y pueden acceder a sus miembros privados.– Ninguna función puede autodeclararse amiga y
acceder a la privacidad de una clase sin que la propia clase tenga conocimiento de ello.
25
26Informática II 2011/2
GRACIAS POR SU ATENCIÓN
27
BIBLIOGRAFÍA
• Pagina de Referencia lenguaje C++: • http://www.cplusplus.com/reference/std/ex
ception/exception/• http://www.cplusplus.com/reference/std/std
except/• Sams Teach yourselft C++ in 21 days:
http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1
Informática II 2011/2
Informática II 2009/2
28