PRÁCTICA 7
ANÁLISIS Y DISEÑO DE PROGRAMAS (Herencia múltiple)
Objetivos
1. El alumno conocerá las características de la herencia múltiple.
2. Conocerá las sintaxis para el manejo de constructores con herencia múltiple.
3. Solucionará problemas utilizando herencia múltiple.
En la 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 como se ve en la Ilustración 1.
Para definir una relación de herencia múltiple se utiliza la sintaxis expuesta en la Ilustración 2:
class Base1 {
// Declaración de atributos y métodos de la clase Base1 };
class Base2 {
// Declaración de atributos y métodos de la clase Base2 };
class Derivada : public Base1, public Base2 {
// Declaración de atributos y métodos de la clase Derivada };
Clase 1 Clase 2
Clase derivada
Ilustración 1. Herencia múltiple
Ilustración 2.Sintaxis herencia múltiple
El constructor de la clase “Derivada”, se define como se ve en la Ilustración 3.
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 Base n. Por último, se ejecutan las instrucciones que aparezcan en el cuerpo del constructor de la clase Derivada.
En la Ilustración 3 se muestra un ejemplo de herencia múltiple.
Ilustración 3.Constructor herencia múltiple Derivada :: Derivada (parámetros) :
Base1 (parámetros propios de la clase Base1), Base2 (parámetros propios de la clase Base2) {
// Cuerpo del constructor de la clase Derivada }
#include <iostream>
#include <string.h>
using namespace std;
class Boleto // Clase Base Boleto {
private:
float Precio;
char Numero[64], CiudadOrigen[64], CiudadDestino[64];
public:
// Funciones Miembro
Boleto( ){ }; // constructor por defecto
Boleto(float, char *, char *, char *); // constructor con parámetros void imprimirdatos( );
};
// Declaración del constructor con parámetros
Boleto :: Boleto(float Prec, char Num[], char CO[], char CD[]) {
Precio = Prec;
strcpy(Numero, Num);
strcpy(CiudadOrigen, CO);
strcpy(CiudadDestino, CD);
}
// Método que despliega los valores de los atributos de un boleto void Boleto :: imprimirdatos( )
{
cout << endl << endl;
cout << "--- Imprimir los Datos del Boleto ---" << endl;
cout << "Numero del boleto : " << Numero << endl;
cout << "Precio : $ " << Precio << endl;
cout << "De la ciudad: " << CiudadOrigen << " a la ciudad: " << CiudadDestino <<
endl;
}
class Hotel // Clase Base Hotel {
private:
float PrecioHab;
int NumHab;
char TipoHab[10];
public:
// Funciones Miembro
Hotel( ){ }; // constructor por defecto
Hotel(float, int, char *); // constructor con parámetros void imprimirdatos( );
};
// Declaración del constructor con parámetros Hotel :: Hotel(float PrecH, int NH, char TH[ ]) {
PrecioHab = PrecH;
NumHab = NH;
strcpy(TipoHab, TH);
}
// Método que despliega los valores de los atributos de un hotel void Hotel :: imprimirdatos( )
{
cout << endl << endl;
cout << "--- Imprimir los Datos de la Habitacion del Hotel ---" << endl;
cout << "Numero de Habitacion: " << NumHab << endl;
cout << "Precio : $ " << PrecioHab << endl;
cout << "Tipo de Habitacion: " << TipoHab << endl;
}
/* 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( );
};
// Declaración del constructor con parámetros
PlanVacac :: PlanVacac(float PB, char NB[ ], char CO[ ], char CD[ ], float PH, int NH, char TH[ ], char Desc[ ], int TD) : Boleto(PB, NB, CO, CD), Hotel(PH, NH, TH) {
strcpy(Descripcion, Desc);
TotalDias = TD;
void PlanVacac :: imprimirdatos( ) {
cout << endl << endl;
cout << "--- Imprimir los Datos del Plan Vacacional ---" << endl;
cout << "Descripcion: " << Descripcion << endl;
cout << "Total de Dias: " << TotalDias << endl;
Boleto :: imprimirdatos( );
Hotel :: 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 */
char CO[64], CD[64], NumBol[64], TH[10], Desc[80];
float Prec, PrecHab;
int NumHab, TD;
cout << "De que ciudad sale? ";
gets(CO);
cout << "A que ciudad llega? ";
gets(CD);
cout << "Precio del Boleto: ";
cin >> Prec;
fflush(stdin); // para liberar buffer de memoria cout << "Numero de Boleto: ";
gets(NumBol);
cout << "Tipo de Habitacion: ";
gets(TH);
cout << "Precio de la Habitacion: ";
cin >> PrecHab;
cout << "Numero de habitacion asignada: ";
cin >> NumHab;
fflush(stdin);
cout << "Tipo de Paquete: ";
gets(Desc);
cout << "Total de Dias: ";
cin >> TD;
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;
}
Referencia.
Programación II. Guía 9, Recuperado el 10 de noviembre de 2015 de:
http://www.udb.edu.sv/udb/archivo/guia/informatica-ingenieria/programacion-ii/2013/i/guia-9.pdf