Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía 9 1
Facultad: Ingeniería
Escuela: Computación
Asignatura: Programación II
Objetivos Específicos
Materiales y Equipo
Introducción Teórica
La Herencia.
Es la capacidad de compartir atributos y métodos entre clases.
Es la propiedad que permite definir nuevas clases usando como base clases ya existentes.
La nueva clase (clase derivada) hereda los atributos y comportamiento que son específicos de
ella.
La herencia es una herramienta poderosa que proporciona un marco adecuado para producir
software fiable, comprensible, de bajo costo, adaptable y reutilizable.
La herencia o relación es-un es la relación que existe entre dos clases, en la que una clase
denominada derivada o subclase se crea a partir de otra ya existente, denominada clase
base o superclase.
2 Programación II, Guía 9
Evidentemente, la clase base y la clase derivada tienen código y datos comunes, de modo que
si se crea la clase derivada de modo independiente, se duplicaría mucho de lo que ya se ha
escrito para la clase base.
C++ soporta el mecanismo de derivación que permite crear clases derivadas, de modo que la
nueva clase hereda todos los datos miembro que pertenecen a la clase ya existente.
Tipos de Herencia.
La relación de herencia entre clases puede ser: pública (public), privada (private) ó protegida
(protected). La relación que se utiliza con mayor frecuencia es la pública.
Dependiendo del número de clases y de cómo se relacionen, la herencia puede ser:
a) Simple.
b) Múltiple.
c) De niveles múltiples.
Con independencia del tipo de herencia, una clase derivada no puede acceder a variables y
funciones privadas de su clase base. Para ocultar los detalles de la clase base y de clases y
funciones externas a la jerarquía de clases, una clase base utiliza normalmente elementos
protegidos en lugar de elementos privados.
Suponiendo herencia pública, los elementos protegidos son accesibles a las funciones
miembro de todas las clases derivadas.
Herencia Simple.
Cuando sólo se tiene una clase base de la cual hereda la clase derivada, se dice que hay
herencia simple (Figura 1.a). Sin embargo, la herencia simple no excluye la posibilidad de que
de una misma clase base se pueda derivar más de una subclase o clase derivada (Figura 1.b).
Programación II. Guía 9 3
(a) (b)
Figura 1. Herencia Simple.
Persona Mamífero
(a) (b)
Figura 2. Ejemplos de Herencia Simple.
En la figura 2a, la clase Persona es la clase base y Empleado es la clase derivada. Un objeto
de esta clase también es un objeto de la clase “Persona”, por lo tanto tendrá los atributos y
métodos de ambas clases.
En la figura 2b, la clase Mamífero es la clase base y Vacuno y Equino son las clases
derivadas. En este caso, se dice que todo “Vacuno” y todo “Equino” también son objetos de la
clase “Mamífero” y en consecuencia tendrán todos los atributos y métodos que heredan de la
clase base.
La herencia pública permite que los miembros privados de la clase base se puedan acceder
sólo por medio de los métodos de dicha clase.
Los miembros protegidos de la clase base podrán ser usados por los métodos de las clases
derivadas, pero no por sus clientes.
4 Programación II, Guía 9
Los miembros públicos estarán disponibles para los métodos de las clases derivadas y para
todos sus clientes.
class Base
{ private:
// Miembros declarados en la sección privada: accesibles sólo para miembros de esta clase
protected:
/* Miembros declarados en la sección protegida: accesibles sólo para miembros de esta
clase y de sus derivadas */
public:
// Miembros declarados en la sección pública: accesibles para todos
};
Para declarar una clase derivada de una clase previamente definida se utiliza la siguiente
sintaxis:
class Base
{ // Declaración de atributos y métodos de la clase Base
};
// Relación de herencia pública entre las clases Base y Derivada
class Derivada : public Base
{ // Declaración de atributos y métodos de la clase Derivada
};
Con la palabra reservada public en el encabezado de la declaración de la clase “Derivada” se
hace referencia a que dicha clase hereda los atributos y métodos de la clase “Base”.
Herencia Múltiple.
En el tipo de herencia múltiple se usan dos o más clases base para derivar una clase. Es decir,
la clase derivada comparte los atributos y los métodos de más de una clase (Figura 3).
Clase Derivada
class Base2
{ // Declaración de atributos y métodos de la clase Base2
};
class BaseN
{ // Declaración de atributos y métodos de la clase BaseN
};
// Relación de herencia múltiple entre las clases Base1, Base2, BaseN y Derivada
class Derivada : public Base1, public Base2, public BaseN
{ // Declaración de atributos y métodos de la clase Derivada
};
Cuando la palabra reservada public, precede el nombre de cada una de las clases se hace
referencia a que la clase “Derivada” hereda atributos y métodos de todas ellas.
6 Programación II, Guía 9
Para definir el constructor de la clase “Derivada”, se procede de la siguiente manera:
Derivada :: Derivada (parámetros) : Base1 (parámetros propios de la clase Base1), Base2
(parámetros propios de la clase Base2), …, BaseN (parámetros propios de la clase BaseN)
{ // Cuerpo del constructor de la clase Derivada
}
Al llamar al constructor de la clase Derivada, primero se ejecuta el constructor de la clase
Base1, después el constructor de la clase Base2, y así sucesivamente hasta el constructor de
la clase Basen. Por último, se ejecutan las instrucciones que aparezcan en el cuerpo del
constructor de la clase Derivada.
Clase Derivada
1.1
Figura 4. Herencia de niveles múltiples.
Este tipo de herencia es muy útil cuando es necesario representar, a partir de conceptos
generales, conceptos más específicos. Cuantos más niveles se deriven, mas especificidad se
definirá.
La figura 5 presenta un ejemplo de herencia de múltiples niveles. El nivel superior representa la
clase más general, la clase “Árbol”. Luego, la clase “Frutal” es una clase derivada de la
primera, lo cual indica que los frutales son una clase más específica de árboles. Por último, se
define la clase Cítrico como una subclase de la clase “Frutal”. Esta relación también indica que
los cítricos son una variante, una clase más específica, de los árboles frutales.
Programación II. Guía 9 7
Árbol
Frutal
Cítrico
Procedimiento
Ejemplo 1:
Se realiza la implementación de la jerarquía de clases mostrada en la siguiente figura
(Herencia Simple):
Persona
Empleado
Para ello se define una clase “Persona” formada por atributos protegidos y públicos, y se usa
como clase base para definir la clase “Empleado”. Los objetos que sean del tipo Empleado
tendrán los atributos de esta clase (por ejemplo “Salario”), además de los atributos heredados
de la clase “Persona”.
#include <iostream>
#include <iomanip> /* Contiene prototipos de función para manipuladores de flujo que
dan formato a flujos de datos. Permitirá formatear y organizar
la salida de datos. */
public:
// Funciones Miembro
Persona( ) { }; // constructor por defecto
void leerdatos( );
void imprimirdatos( );
};
// Declaración del Método para dar valor a los atributos de la clase Persona
void Persona :: leerdatos( )
{ cout << “Digitar el Nombre:" << endl;
gets(nombre);
cout << "Digitar la Edad: " << endl;
cin >> edad;
}
public:
Empleado( ){ }; // constructor por defecto
void leeremp( );
void imprimiremp( );
};
// Declaración del Método para dar valor a los atributos de la clase Empleado
void Empleado :: leeremp( )
{ Persona::leerdatos();
cout << "Introducir Cargo:" << endl;
cin >> cargo;
cout << "Introducir Sueldo:" << endl;
cin >> salarioanual;
}
Programación II. Guía 9 9
int main( )
{ Empleado Employee1; // Asociar variable con clases
Employee1.leeremp( ); // Obtener Información de Empleado
Employee1.imprimiremp( ); // Imprimir Información Empleado
system("pause>nul");
return 0;
}
Ejemplo 2:
Se muestra un ejemplo de Herencia Múltiple. Se realiza la implementación de la jerarquía
de clases mostrada en la siguiente figura:
Boleto Hotel
Plan de Vacación
Se definen las clases “Boleto” y “Hotel” que se utilizarán como base para definir la clase
derivada “PlanVacac”. Esta clase heredará todos los miembros de las clases bases,
aunque solo tendrá acceso a los miembros públicos de ellas.
#include <iostream>
public:
// Funciones Miembro
Boleto( ){ }; // constructor por defecto
Boleto(float, char *, char *, char *); // constructor con parámetros
void imprimirdatos( );
};
10 Programación II, Guía 9
public:
// Funciones Miembro
Hotel( ){ }; // constructor por defecto
Hotel(float, int, char *); // constructor con parámetros
void imprimirdatos( );
};
/* Definición de la Clase PlanVacac como clase derivada de las clases Boleto y Hotel.
Esta clase hereda los atributos de las otras dos. Además tiene dos atributos propios */
class PlanVacac : public Boleto, public Hotel
{ private:
char Descripcion[80];
int TotalDias;
public:
PlanVacac( ){ }; // constructor por defecto
// constructor con parámetros
PlanVacac(float, char *, char *, char *, float, int, char *, char *, int);
void imprimirdatos( );
};
PlanVacac Lee() /* Función que solicita al usuario los datos relacionados a un viaje.
Con estos datos se crea un objeto de tipo PlanVacac. Regresa como
resultado dicho objeto */
{
/* variables auxiliares: CO = ciudad origen, CD = ciudad destino, NumBol = número del
boleto de avión, TH = tipo de habitación, Desc = Descripción del plan vacacional,
Prec = precio del boleto, PrecHab = precio de la habitación, NumHab = número de
habitación, TD = total de días del plan */
PlanVacac Paquete(Prec, NumBol, CO, CD, PrecHab, NumHab, TH, Desc, TD);
return Paquete;
}
int main()
{ PlanVacac Viaje; // Se crea obbjeto de tipo PlanVacac
Viaje = Lee( ); /* Se le proporcionan valores a todos los datos miembros del objeto
de tipo PlanVacac */
Viaje.imprimirdatos( );
system("pause>nul");
return 0;
}
Análisis de Resultados
Ejercicio 1:
Realice las modificaciones necesarias al ejemplo No. 1, de tal manera que se construya una
solución para la jerarquía de clases mostrada en la siguiente figura:
Persona
Empleado Estudiante
Universitario
Pasante
Programación II. Guía 9 13
Para la clase Estudiante considerar los atributos: número de carnet, nivel de estudios.
Para la clase Universitario considerar los atributos: nombre de la universidad, carrera, materias
inscritas, notas, CUM.
Para la clase Pasante considerar los atributos: nombre del proyecto, total de horas (duración
de la pasantía), número de horas completadas.
La solución se debe manejar a través de un menú que permita realizar las siguientes acciones:
a) Crear los objetos de tipo Pasante, solicitando los datos al usuario.
b) Verificar que universidad proporciona la mayoría de pasantes en una empresa.
c) Visualizar el promedio de notas de los estudiantes para seleccionar los pasantes.
d) Salir de la aplicación.
El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario
seleccione la opción salir.
El programa debe estar debidamente comentado.
Investigación Complementaria
Considere la siguiente jerarquía de herencias:
Vehiculo
Agencia de Viajes
Definir las clases. Decidir que atributos y métodos incluir en cada clase de tal manera que su
programa pueda a través de un menú realizar las siguientes acciones:
a) Crear objetos de cualquier tipo, solicitando los datos al usuario.
b) Solicitar un paquete en un crucero a algún destino.
c) Verificar que opciones de transporte terrestre se tienen para la realización de un viaje
de fin de semana.
d) Reservar un paquete que incluya boleto aéreo a cualquier destino.
e) Salir de la aplicación.
El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario
seleccione la opción salir. El programa debe estar debidamente comentado.
14 Programación II, Guía 9
EVALUACIÓN
ACTITUD
Del 15% No tiene Actitud Tiene actitud
al 30% actitud propositiva y proactiva y
proactiva. con sus
propuestas no propuestas
aplicables al son
contenido de concretas.
la guía.
TOTAL 100%