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. |
|
2. |
|
3. |
|
3.1 |
Ejemplo1 : Necesidad de Clases Base Virtualizadas |
3.2 |
Ejemplo2 :Implementación Clases Base Virtualizadas |
4. |
|
5. |
OBJETIVO
Conceptuar e
implementar aplicaciones orientadas a objetos que impliquen la generación de
Clases Base Virtualizadas
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?
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.
Clases
Abstractas, Materialización, Funciones virtuales Puras.