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.

Objetivos

2.

Conceptualización

3.

Sintaxis

3.

Ejemplos

3.1

Ejemplo1 : Herencia Simple

3.2

Ejemplo2 :Herencia Múltiple

4.

Aplicación

5.

Consulta

 

 

OBJETIVO

 

Conceptuar e implementar aplicaciones orientadas a objetos que impliquen herencia múltiple.

 

 

 

CONCEPTUALIZACIÓN

 

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.

 

 

SINTAXIS

 

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.

 

EJEMPLOS

 

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;

}

 

 

 

 

APLICACIÓN

 

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.

 

 


 

 

CONSULTAS

 

Preparemos las siguientes temáticas para la siguiente sesión:

-         Clases abstractas

-         Funciones virtuales y materialización