You are on page 1of 7

Herencia simple

La herencia es específica de la programación orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia (a la que habitualmente se denomina subclases) proviene del hecho de que la subclase (la nueva clase creada) contiene las atributos y métodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y métodos nuevos para la subclase, que luego se aplican a los atributos y métodos heredados. Esta particularidad permite crear una estructura jerárquica de clases cada vez más especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases que ofrecen una base que puede especializarse a voluntad (la compañía que vende estas clases tiende a proteger las datos miembro usando la encapsulación). Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportará como pública en la clase Base y en las que componen la jerarquía de herencia, y como privada en las clases que NO sean de la jerarquía de la herencia. Ejemplo: clases Barco, Acorazado, Carguero, etc. un Acorazado ES-UN Barco, un Carguero ES-UN Barco, un Trasatlántico ES-UN Barco, etc. En este ejemplo tendríamos las cosas generales de un Barco (en C++) class Barco { protected: char* nombre; float peso; public: //Constructores y demás funciones básicas de barco };

class Acorazado: public Barco { private: int numero Armas. será privado en la clase Derivada (las propiedades heredadas serán privadas aunque estas sean públicas en la clase Base)  Herencia protegida (clase Derivada: protected Base): Con este tipo de herencia. . Por último. int Soldados. por ejemplo: class Carguero: public Barco { // Esta es la manera de especificar que hereda de Barco private: float carga.  Herencia privada (class Derivada: private Base): Con este tipo de herencia todo componente de la clase Base. podrían (a la vez que heredan las de barco) añadir cosas propias del subtipo de barco que vamos a crear. //El resto de cosas }. hay que mencionar que existen 3 clases de herencia que se diferencian en el modo de manejar la visibilidad de los componentes de la clase resultante:  Herencia publica (class Derivada: public Base ): Con este tipo de herencia se respetan los comportamientos originales de las visibilidades de la clase Base en la clase Derivada. // El resto de cosas }. todo componente publico y protegido de la clase Base. siguen siendo privados. será protegido en la clase Derivada. y los componentes privados.y ahora las características de las clases derivadas.

Comprobar Existencias(). no de una sola clase base. Si esto lo trasladamos a la programación sería herencia múltiple (clase empleado_tienda): class Persona { . como empleado que es.. Para entender esto mejor. Almacenar Stock(). . que puede cobrarte dinero por la compra. pongamos un ejemplo: Cuando ves a quien te atiende en una tienda. pero.. }. sino de varias.. . también podrás suponer que tiene un jefe. Cobrar(). podrás suponer que puede hablar. Por tanto. Caminar(). }. Empleado { . es posible utilizar más de una clase para que otra herede sus características.. etc. andar.. class Empleado { Persona jefe. Hablar(). por otro lado. que puede devolverte el cambio.Herencia múltiple La herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir. int sueldo... .. }.. . como persona que es. class empleado_tienda: public Persona. comer..

. lo que significa que una clase puede heredar los atributos de otras dos superclases. Jerarquía de clase La relación primaria-secundaria entre clases puede representarse desde un punto de vista jerárquico. existen muchas metáforas genealógicas). Este método puede utilizarse para agrupar atributos y métodos desde varias clases dentro de una sola. como C++ permiten herencias múltiples. Las clases derivadas (clase secundaria o subclase) se vuelven cada vez más especializadas a medida que van descendiendo el árbol. se suele hacer referencia a la relación que une a una clase secundaria con una clase primaria mediante la frase "es una" x o y. denominado vista de clases en árbol. Por lo tanto. o clase madre. clase padre. clase principal.Herencia múltiple Algunos lenguajes orientados a objetos. La vista en árbol comienza con una clase general llamada superclase (a la que algunas veces se hace referencia como clase primaria.

Instituto Politécnico Nacional Escuela Superior de Ingeniería Mecánica y Eléctrica Programación orientada a objetos Murillo Hernández Jesús Eduardo Salinas Cerón Diego 2AM4 Herencia .

} }. class derivada2 : public derivada1 { public: derivada2() { cout << "Construyendo derivada2\n". } ~derivada1() { cout << "destruyendo derivada1\n".Programas #include <iostream> using namespace std. return 0. class base { public: base() { cout << "construyendo base\n". // construir y destruir obj system("pause"). } ~base() { cout << "Destruyendo base\n". int main() { derivada2 obj. } }. } ~derivada2() { cout << "Destruyendo derivada2\n". class derivada1 : public base { public: derivada1() { cout << "Construyendo derivada1\n". } . } }.

mostrar(). int main() { derivada obj(3. class base2 { protected: int k. obj. public: base1(int x) { i=x. public base2 { public: /* el constructor en derivada no usa parametros. } }.#include <iostream> using namespace std. public: base2(int x) { k=x. int y) : base1(x). // mostrar 3 4 system("pause"). } void mostrar() { cout << i << "" << k << "\n". class base1 { protected: int i. class derivada : public base1. } ~base1() { cout << "Destruyendo base1\n". cout << "construyendo base2\n". */ derivada(int x. } ~base2() { cout << "Destruyendo base2\n". } ~derivada() { cout << "Destruyendo derivada\n". } }. return 0. pero aun asi debe ser declarado para tomarlos y pasarselos a las clases base. } . } }. cout << "Construyendo base1\n". base2(y) { cout << "Construyendo derivada\n". 4).