LABORATORIO
8: Herencia Múltiple
Antes de comenzar reflexionemos…
“Cada guía que diseño exige mucho trabajo
por cuenta de mis estudiantes, qué noble sería que se reconociera que
producirla demanda un tiempo mayor”
Miguel Angel Mendoza Moreno
1. |
|
2. |
|
3. |
|
3. |
|
3.1 |
Ejemplo1 : Herencia Simple |
3.2 |
Ejemplo2 :Herencia Múltiple |
4. |
|
5. |
OBJETIVO
Conceptuar e
implementar aplicaciones orientadas a objetos que impliquen herencia múltiple.
Recordemos que…
La herencia es la propiedad del Paradigma Orientado a
Objetos que permite hacer uso de métodos y atributos de una clase a otra,
respetando el encapsulamiento y la respectiva
ocultación –a diferencia de las funciones amigas-, lo que conlleva como
beneficio eliminar la duplicidad de código y la cooperación entre objetos –principio
fundamental del paradigma-.
Por defecto, la herencia es private. Cuando se define el especificador de
acceso se debe tener en cuenta la siguiente correspondencia:
Especificador de Acceso |
Corresponde a … |
public: |
Todos
los miembros públicos de la clase base se tratarán como miembros públicos de
clase derivada. Los
miembros protegidos de la clase base, se tratan como protegidos de la clase
derivada. Los
miembros privados en la clase base no son accesibles desde la clase derivada. |
protected: |
Todos
los miembros públicos de la clase base se tratarán como miembros protegidos
de clase derivada. Los
miembros protegidos de la clase base, se tratan como protegidos de la clase
derivada. Los
miembros privados en la clase base no son accesibles desde la clase derivada. |
private: |
Todos
los miembros públicos de la clase base se tratarán como miembros privados de
clase derivada. Los
miembros protegidos de la clase base, se tratan como privados de la clase
derivada. Los
miembros privados en la clase base no son accesibles desde la clase derivada. |
HERENCIA MÚLTIPLE
En anteriores guías se definía que se presenta herencia simple cuando una clase derivada hereda de una y solo una clase base, ahora bien, se presenta Herencia Múltiple cuando una clase derivada obtiene la herencia de más de una clase base.
Cuando se
tienen múltiples niveles de herencia –o relaciones-, se habla de Jerarquización de Clases.
C++ denota la herencia múltiple de la siguiente manera:
class Derivada:especificador_de_acceso Base1, especificador_de_acceso Base2{
//Definiciones de atributos y métodos
}
Simplemente, para definir que la clase deriva de varias clases base, se separan estas por comas.
NOTA. No olvide crear las respectivas subcarpetas
para cada ejemplo.
Ejemplo 1: Fortalezcamos el trabajo con Herencia Simple.
Trabajito: Al término redacte un archivo analisis.txt
en esta misma carpeta, en el que analice el manejo de cada una de las temáticas
propias del ejemplo.
#include<iostream.h>
/*
INFORMACION ADMINISTRATIVA
Este ejemplo no modulariza
en los archivos de rigor
Observe el tratamiento a los atributos que se
alojan en dos clases relacionadas por medio de herencia
*/
class Base{
int
num;
public:
void
setNum(int);
int
getNum();
};
class Derivada:public Base{
int
num;
public:
void
setNum(int);
int
getNum();
};
void Base::setNum(int n){
num=n;
}
int Base::getNum(){
return
num;
}
void Derivada::setNum(int n){
num=n;
}
int Derivada::getNum(){
return
num;
}
int main(){
Derivada obj;
int x;
cout<<"MIREMOS LA HERENCIA SIMPLE\n"
<<"...lo que ocurre con métodos y atributos identicos\n"
<<"...y
el manejo de áreas de visibilidad"<<endl;
cout<<endl<<"Un
primer número ";
cin>>x;
obj.Base::setNum(x);
cout<<endl<<"Un
segundo número ";
cin>>x;
obj.setNum(x);
cout<<obj.Base::getNum()<<"
+ "<<obj.getNum()<<" =
"<<obj.Base::getNum()+obj.getNum()<<endl;
cin.get(); cin.get();
return
0;
}
Ejemplo 2: Herencia Múltiple.
Trabajito: Al término redacte un archivo analisis.txt
en esta misma carpeta, en el que analice el manejo de cada una de las temáticas
propias del ejemplo.
Adicione los
siguientes casos de análisis:
- ¿Incidiría en algo cambiar la definición de la clase C1 así:
class
C1:public B1,protected B2?
- ¿Incidiría en algo cambiar la definición de la clase C1 así:
class
C1:private B1,private B2?
#include
<iostream.h>
class B1{
int a;
public:
B1(int x){a=x;} //Todo constructor es como un metodo set
int getA(){return a;}
};
class B2{
int b;
public:
B2(int x){b=x;}
int getB(){return b;}
};
class
C1:public B1,public B2{
int c;
public: //Analizar el siguiente constructor
C1(int x,int y,int z):B1(z),B2(y){ c=x;}
int getC(){return c;}
void visualizar(){
cout<<"\nRESULTADO DESDE INTERFAZ DE CLASE C1"<<endl;
cout<<"revisar la constitucion del codigo!"<<endl;
cout<<"a=
"<<getA()<<"\nb= "<<getB();
cout<<"\nc=
"<<c<<"\n";
}
};
int main(){
C1 objeto(1,2,3);
cout<<"\nRESULTADO DESDE INTERFAZ DE MAIN"<<endl;
cout<<"revisar la constitucion del codigo!"<<endl;
cout<<"a=
"<<objeto.getA()<<"\nb= "<<objeto.getB();
cout<<"\nc=
"<<objeto.getC()<<"\n";
objeto.visualizar();
cin.get();
return 0;
}
1. Implemente cada uno de los ejemplos denotados previamente.
2. Cree una nueva carpeta y en ella copie el ejemplo2
a. Modifique el especificador de clase C1 así:
class C1:protected
B1,protected B2{ y a partir de ello realice las
respectivas modificaciones para que el programa siga operando adecuadamente.
Relate su análisis en el archivo analisis.txt de esta carpeta.
3. Verifique la siguiente estructura:
Suponga que existe la siguiente especificación de herencia entre clases:
- B y C heredan público de A
- D hereda protegido de B y publico de C
- E hereda privado de D
- F hereda público de D
Implemente el anterior esquema y diseñe los respectivos métodos que permitan acceder métodos y atributos distantes en la jerarquía conformada.
Genere un archivo analisis.txt que relate la manera en que se está presentando la herencia en esta jerarquía de clases y la necesariedad de los métodos empleados.
Preparemos las siguientes temáticas para la siguiente
sesión:
- Clases abstractas
-
Funciones virtuales y materialización