Programación II POO en C++ | Herencia
Programación Orientada a Objetos (POO)
• Una clase puede heredar las propiedades de otra.
• Permite construir una jerarquía de clases, de lo general a lo
particular.
• Permite crear clases, las cuales se derivan de otras clases.
Basado en:
• Stroustrup, B. El Lenguaje de Programación C++. Edición Especial, Addison Wesley, 2002.
• Schildt, H. C++ Guía de autoenseñanza. Osborne McGraw-Hill. 1995.
• Josuttis, N. M. The C++ Standard Library. A tutorial and reference. Addison-Wesley. 1999.
• C++ Language Tutorial at [Link] Liliana Félix
Programación II POO en C++ | Herencia
Clase base
• Clase padre
• Define todas las cualidades comunes a cualquier clase
derivada.
Liliana Félix
Programación II POO en C++ | Herencia
Clase derivada
• Clase hijo
• Incluye las cualidades de su padre y añade las propias.
Liliana Félix
Programación II POO en C++ | Herencia
Ejemplo
Liliana Félix
Programación II POO en C++ | Herencia
Sintaxis
• Especificador de acceso describe el nivel de acceso
máximo de los miembros que son heredados desde la
clase base
id clase derivada
especificador de acceso
id clase base
Liliana Félix
Programación II POO en C++ | Herencia
Los miembros heredados desde CPoligono son:
• ancho
• alto
• toma_valores()
Liliana Félix
Programación II POO en C++ | Herencia
Encapsulamiento
int main() {
CRectangulo r;
CTriangulo t;
r.toma_valores(4, 5); método definido en la clase base
t.toma_valores(4, 5);
cout << [Link]() << endl; método definido particularmente
cout << [Link]() << endl; en cada clase derivada
return 0;
}
Liliana Félix
Programación II POO en C++ | Herencia
Acceso de los miembros de una clase derivada
• Pueden acceder a los miembros protegidos.
• No pueden acceder a los miembros privados.
Liliana Félix
Programación II POO en C++ | Herencia
Acceso de los miembros de una clase derivada
• Pueden acceder a los miembros protegidos.
• No pueden acceder a los miembros privados.
de su clase base
Liliana Félix
Programación II POO en C++ | Herencia
Tabla Resumen de Accesos
Liliana Félix
Programación II POO en C++ | Herencia
Accesos en Herencia
• Los miembros heredados a una clase tienen los mismos
permisos de acceso que en su clase base
Liliana Félix
Programación II POO en C++ | Herencia
Accesos en Herencia
• Los miembros heredados a una clase tienen los mismos
permisos de acceso que en su clase base.
protected
CPoligono::ancho
CRectangulo::ancho
public
CPoligono::toma_valores()
CRectangulo::toma_valores()
Liliana Félix
Programación II POO en C++ | Herencia
Accesos en Herencia
• Los miembros heredados a una clase tienen los mismos
permisos de acceso que en su clase base.
Todos los miembros public en base
serán protected en derivada
class derivada: protected base {
…
};
derivada puede tener sus propios
miembros public
Liliana Félix
Programación II POO en C++ | Herencia
Accesos en Herencia
• Los miembros heredados a una clase tienen los mismos
permisos de acceso que en su clase base.
Todos los miembros public en base
serán private en derivada
class derivada: private base {
…
};
derivada puede tener sus propios
miembros public
Liliana Félix
Programación II POO en C++ | Herencia
¿Qué se hereda?
• Cada miembro excepto
• constructor y destructor
• operator=
• amigos
• miembros privados
Liliana Félix
Programación II POO en C++ | Herencia
Constructor y Destructor
• Aunque no son heredados, el constructor/destructor por
defecto se ejecutan automáticamente cuando un nuevo
objeto de una clase derivada es creado/destruido.
• Se puede especificar un constructor en cada definición de
constructor de una clase derivada.
Liliana Félix
Programación II POO en C++ | Herencia
Constructor y Destructor
• Aunque no son heredados, el constructor/destructor por
defecto se ejecutan automáticamente cuando un nuevo
objeto de una clase derivada es creado/destruido.
• Se puede especificar un constructor en cada definición de
constructor de una clase derivada.
class base { class derivada: public base {
… …
public: public:
base(); derivada(arg y) : base(y) { … }
base(arg x) { … } };
};
Liliana Félix
Programación II POO en C++ | Amigos
Amigos (palabra clave: friend)
• Métodos
• Clases
Liliana Félix
Programación II POO en C++ | Herencia
Amigos
• Un método declarado como friend no es miembro de la
clase pero sí puede acceder a los miembros privados de
ésta. Ese método se puede ejecutar en cualquier parte.
• Una clase declarada como friend puede acceder a los
miembros privados de la clase donde es declarada.
• Amistad no es correspondida, a menos que se especifique
explícitamente.
• Amistad no es transitiva.
Liliana Félix
Programación II POO en C++ | Amigos
Ejemplo
Liliana Félix
Programación II POO en C++ | Amigos
Ejemplo
Liliana Félix
Programación II POO en C++ | Amigos
Ejemplo
Liliana Félix
Programación II POO en C++ | Amigos
Ejemplo
Liliana Félix
Programación II POO en C++ | Herencia
Múltiple
• Una clase hereda miembros desde más de una clase.
• Se separan con comas las diferentes clases bases en la
declaración de la clase derivada.
Liliana Félix
Programación II POO en C++ | Herencia
Múltiple
• Una clase hereda miembros desde más de una clase.
• Se separan con comas las diferentes clases bases en la
declaración de la clase derivada.
class base1 { class derivada: public base1, public base2 {
… …
}; };
class base2 {
…
};
Liliana Félix
Programación II POO en C++ | Herencia
Múltiple
• Una clase hereda miembros desde más de una clase.
• Se separan con comas las diferentes clases bases en la
declaración de la clase derivada.
class base1 { class derivada: public base1, public base2 {
… …
}; };
class base2 {
…
};
Liliana Félix
Programación II POO en C++ | Herencia
Miembro Virtual
• Miembro de una clase base que puede ser redefinido en
sus clases derivadas.
• Su filosofía subyacente es el polimorfismo.
• Su tipo y sus argumentos (número y tipo) deben ser
idénticos en todas sus redefiniciones, lo cual es diferente de
la sobrecarga.
• Si una clase derivada no redefine un miembro virtual, se
utiliza la definición dentro de la clase base.
Liliana Félix
Programación II POO en C++ | Herencia
Clase polimórfica
• Contiene al menos un método virtual.
Liliana Félix
Programación II POO en C++ | Miembro Virtual
Ejemplo
Liliana Félix
Programación II POO en C++ | Miembro Virtual
Ejemplo
Liliana Félix
Programación II POO en C++ | Herencia
Clase abstracta
• Contiene al menos un método virtual puro (sin
implementación).
• No se puede instanciar.
Liliana Félix
Programación II POO en C++ | Herencia
Clase abstracta
• Contiene al menos un método virtual puro (sin
implementación).
class base {
…
public:
virtual tipo metodo()=0;
};
Liliana Félix
Programación II POO en C++ | Herencia
Clase abstracta
• Contiene al menos un método virtual puro (sin
implementación).
class base {
…
public:
virtual tipo metodo()=0; método virtual puro
};
Liliana Félix