Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Laboratorio8 SIS2210

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

FACULTAD NACIONAL DE INGENIERIA

INGENIERIA DE SISTEMAS E INGENIERIA INFORMATICA


METODOLOGIA DE LA PROGRAMACION II
LABORATORIO DE PROGRAMACION – SIS 2210
LABORATORIO NRO 8.

Tema: Polimorfismo
Logros a alcanzar:
 Comprende el concepto de función virtual
 Comprende el concepto de polimorfismo.
 Comprende el concepto de clases virtuales
 Implementa funciones virtuales y clases virtuales
 Aplica las clases virtuales para implementar herencia y polimorfismo.
.
Fundamento Teórico:
Función virtual o método virtual.- Es una función cuyo comportamiento, al ser declarado "virtual", es
determinado por la definición de una función con la misma cabecera en alguna de sus subclases.
Si hay funciones de la clase base redefinidas por la clase derivada y si la función en cuestión es designada
"virtual", se llamará a la función de la clase derivada (si existe). Si no es virtual, se llamará siempre a la función
de la clase base.

Una función virtual es una función que es declarada como 'virtual' en una clase base y es redefinida en una o
más clases derivadas. Además, cada clase derivada puede tener su propia versión de la función virtual.

Destructores virtuales.- Es importante para una clase base de C++ tener un destructor virtual para asegurar que
se llamará siempre al destructor de la clases derivadas inferiores, si el destructor no es virtual solamente
eliminará los recursos de la clase base sin eliminar los recursos utilizados por las clases derivadas.

Clase abstracta: es una clase que no está completamente especificada (posee métodos sin implementar), por lo
tanto no se pueden crear instancias de la misma. Una clase abstracta se usa para servir de clase base a otras
clases. En terminología C++ se dice que una clase abstracta es aquella que posee al menos un método virtual
puro.

 Virtual: obliga a las clases derivadas a implementar ese método.


 Puro: no pueden crearse instancias de esa clase.
Polimorfismo.- Es demostrar comportamientos distintos según la situación. Puede darse de tres formas diferentes:

 Funciones: sobrecarga.
 Clases: es al que se refiere normalmente el concepto de polimorfismo.
 Enlace dinámico: métodos virtuales.

Actividad de Clase:

//Ejemplo 1.- Definición básica de función virtual


ficha2::ficha2(int ref, string tit, string aut):ficha(ref,tit)
#include <iostream>
using namespace std; {
class ficha autor.assign(aut);
{ }
protected: void ficha::visualizar()
int *referencia; {
string titulo; cout<< *referencia<<" "<<titulo<<endl;
public: }
ficha(int ref=1, string tit = "sin titulo "); void ficha2::visualizar()
virtual void visualizar(); {
}; cout<< "Autor: "<<autor<<endl;
class ficha2 :public ficha }
{
private: int main()
string autor; {
public: ficha obj1;
ficha2(int ref=2, string tit="sin titulo", string ficha2 obj2(111, "C++","Joyanes Aguilar");
aut="desconocido "); obj1.visualizar();
virtual void visualizar(); obj2.visualizar();
};
//ficha *p1 = &obj1, *p2=&obj2;
ficha::ficha(int ref, string tit) //constructor //p1->visualizar();
{ //p2->visualizar();
referencia = new int; return 0;
*referencia =ref; }
titulo.assign(tit);
}
Ejemplo 2.- Ejemplo básico de Polimorfismo class disco:public volumen
{
#include <iostream> public:
using namespace std; disco(string r=""):volumen(r){} //constructor
class volumen virtual void visualizar()
{ {
protected: cout<<"disco referencia: " << referencia << endl;
string referencia; }
public: };
volumen(string r="")
{ class informatica:public libro
referencia.assign(r); {
} public:
~volumen(){} informatica(string r=""):libro(r){} //constructor
virtual void visualizar(){};
}; virtual void visualizar()
{
class libro:public volumen cout<< "libro de informatica ref:
{ "<<referencia<<endl;
public: }
libro(string r=""):volumen(r){} //constructor };
virtual void visualizar()
{
cout<< "libro referencia: " << referencia <<endl;
}
};
class revista:public volumen
{
public: int main()
revista(string r=""): volumen(r){} //constructor {
virtual void visualizar() biblioteca bibli(20);
{ libro l1("L001"), l2("L002"), l3("L003");
cout<<"revista referencia :" <<referencia <<endl; revista r1("R001"), r2("R002"), r3("R003");
} disco d1("D001"), d2("D002"), d3("D003");
}; informatica inf1("I001"), inf2("I002"), inf3("I003");
bibli.meter(&r1);
class biblioteca bibli.meter(&r2);
{ bibli.meter(&r3);
private: bibli.meter(&l1);
int maxVol,nroVol; bibli.meter(&l2);
volumen **volumenes; bibli.meter(&l3);
public: bibli.meter(&d1);
biblioteca(int maxv); bibli.meter(&d2);
~biblioteca() bibli.meter(&d3);
{ bibli.meter(&inf1);
delete volumenes; bibli.meter(&inf2);
} bibli.meter(&inf3);
void meter(volumen *vol); bibli.visualizarVolumenes();
void visualizarVolumenes();
return 0;
}; }

biblioteca::biblioteca(int maxv)
{
maxVol=maxv;
nroVol=0;
volumenes=new volumen *[maxVol];
for(int i=0;i<maxVol;i++)
volumenes[i]=NULL;
}

void biblioteca::meter(volumen *vol)


{
if(nroVol==maxVol)
{
cout<<"excede la capacidad maxima "<<endl;
return;
}
volumenes[nroVol++]=vol;
}

void biblioteca::visualizarVolumenes()
{
if(nroVol>0)
for(int i=0; i<nroVol;i++)
volumenes[i]->visualizar();
}

También podría gustarte