LABORATORIO 9: Clases Base Virtualizadas

 

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.

Ejemplos

3.1

Ejemplo1 : Necesidad de Clases Base Virtualizadas

3.2

Ejemplo2 :Implementación Clases Base Virtualizadas

4.

Aplicación

5.

#Consulta

 

 

OBJETIVO

 

Conceptuar e implementar aplicaciones orientadas a objetos que impliquen la generación de Clases Base Virtualizadas

 

 

 

CONCEPTUALIZACIÓN

 

Hemos tratado la Herencia como una propiedad del Paradigma Orientado a Objetos que permite a una clase acceder a métodos –y a través de ellos a los atributos- de otra clase considerada de un nivel superior, con el objetivo de reutilizar lo ya creado y establecer una correcta cooperación entre objetos en ligadura tardía.

 

En anteriores laboratorios definíamos una técnica para eliminar la ambigüedad que se puede presentar entre atributos y métodos heredados, ahora trataremos la posible ambigüedad que se presente al heredar clases completas al configurar Jerarquías de Clases de forma simple o múltiple.

 

 

CLASES BASE VIRTUALES

 

Cuando se tiene herencia múltiple, se puede presentar el caso en que en una jerarquía de tres o más niveles se esté heredando por dos caminos diferentes a una misma clase, hecho que podría degenerar en la redundancia de la definición de métodos y atributos al momento de compilar, hecho que estimula la virtualización de la clase base heredada.  Obsérvese la siguiente figura:

 

 

class A{

   //Implementación propia

};

 

class B: public A{

   //Implementación propia

};

 

class C: public A{

   //Implementación propia

};

 

class D: public B, public C{

   //Implementación propia

};

 

 

En el caso citado previamente se evidencia que la clase D hereda de B y C, que simultáneamente heredan de forma simple de la clase A, ¿qué ocurrirá cuando se instancia un objeto de D? Rta./  Se instanciarán objetos a partir de las clases que resultan ser base para él en la jerarquía definida, lo que conlleva a que dos veces se instancien objetos a partir de la clase A, hecho no deseable, por lo que requiere un modelo jerárquico que elimine dicha duplicidad, tal como se evidencia a continuación:

 

 

class A{

   //Implementación propia

};

 

class B: virtual public A{

   //Implementación propia

};

 

class C: virtual public A{

   //Implementación propia

};

 

class D: public B, public C{

   //Implementación propia

};

 

 

Análisis del Caso: Dado que se presentó ambigüedad en la definición de la herencia para la clase D a partir de B y C, la palabra virtual precediendo el especificador de acceso a la clase base permite eliminar la posible redundancia para clases derivadas de nivel inferior en la jerarquía.  En el caso anterior se define que se ha virtualizado a la clase A, o simplemente, A es una Clase Base Virtual.

 

¿Por qué se fijó el especificador virtual a las clases B y C y no a D en el anterior esquema?

 

 

EJEMPLOS

 

NOTA. No olvide crear las respectivas subcarpetas para cada ejemplo.

 

 

Ejemplo 1: Necesidad de Clases Base Virtualizadas

 

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.

 

/*

  INFORMACION ADMINISTRATIVA

Autor: Miguel Angel Mendoza Moreno

Plataforma: Win-DevC++

Descripción: Ejemplo para definir la necesidad de Clases Base Virtualizadas

Nota:  Este ejemplo no modulariza en los archivos de rigor, trabaja un solo bloque monolitico para que las observaciones sean expeditas

*/

#include<iostream.h>

class A{

    int a;

  public:

    void setA(int w){a=w;}      //Funcion inline

    int getA(){return a;}

};

 

class B: public A{

    int b;

  public:

    void setB(int w){b=w;}     

    int getB(){return b;}

};

 

class C: public A{

    int c;

  public:

    void setC(int w){c=w;}     

    int getC(){return c;}

};

 

class D:public B, public C{

    int d;

  public:

    void setD(int w){d=w;}     

    int getD(){return d;}

};

 

int main(){

  cout<<"Verifiquemos la VIRTUALIZACIÓN DE UNA CLASE BASE\n";

  D obj;

//en esta linea fije el valor 1 al atributo a

//en esta linea fije el valor 2 al atributo b 

//en esta linea fije el valor 3 al atributo c 

//en esta linea fije el valor 4 al atributo d 

//en esta linea imprima  el valor del atributo a 

//en esta linea imprima  el valor del atributo b 

//en esta linea imprima  el valor del atributo c 

//en esta linea imprima  el valor del atributo d 

  cin.get();

  return 0;

}

 

Cacharreemos y Analicemos!!!

 

-         Implemente el ejemplo citado previamente

-         Compílelo, ¿cuáles errores salen?, ¿cuál es su causa?, ¿cómo solucionarlos?

 

Recordemos como solucionar ambigüedades!

 

 

Ejemplo 2: Clase Base Virtualizada

 

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.

 

/*

  INFORMACION ADMINISTRATIVA

Autor: Miguel Angel Mendoza Moreno

Plataforma: Win-DevC++

Descripción: Ejemplo para el manejo de Clases Base Virtualizadas

Nota:  Este ejemplo no modulariza en los archivos de rigor, trabaja un solo bloque monolitico para que las observaciones sean expeditas

*/

 

#include<iostream.h>

class A{

    int a;

  public:

    void setA(int w){a=w;}     

    int getA(){return a;}

};

 

class B:virtual public A{

    int b;

  public:

    void setB(int w){b=w;}     

    int getB(){return b;}

};

 

class C:virtual public A{

    int c;

  public:

    void setC(int w){c=w;}     

    int getC(){return c;}

};

 

class D:public B, public C{

    int d;

  public:

    void setD(int w){d=w;}     

    int getD(){return d;}

};

 

int main(){

  cout<<"Verifiquemos la VIRTUALIZACIÓN DE UNA CLASE BASE\n";

  D obj;

  obj.setA(1);

  obj.setB(2);

  obj.setC(3);

  obj.setD(4);

  cout<<endl<<"A= "<<obj.getA();

  cout<<endl<<"B= "<<obj.getB();

  cout<<endl<<"C= "<<obj.getC();

  cout<<endl<<"D= "<<obj.getD();

  cin.get();

  return 0;

}

 

Cacharreemos y Analicemos!!!

 

-         Implemente el ejemplo citado previamente

-         Compílelo y analice:

o       ¿En donde se verifica la virtualización de una clase base?

o       ¿Para qué sirvió la virtualización?

o       ¿De no haber virtualizado, qué ocurriría?

 

 

APLICACIÓN

 

Suponga la estructura de la figura relacionada.  Implemente la jerarquía de clases definiendo y cambiando en tres configuraciones el especificador de herencia.  Cada configuración debe quedar guardada en una carpeta independiente.

 

 

 

CONSULTA

 

Clases Abstractas, Materialización, Funciones virtuales Puras.