Lenguaje C++ Segunda parte Intro. a UML, sobrecarga, polimorfismo, herencia y Templates Ana Lila...

Post on 02-Apr-2015

118 views 0 download

Transcript of Lenguaje C++ Segunda parte Intro. a UML, sobrecarga, polimorfismo, herencia y Templates Ana Lila...

Lenguaje C++Lenguaje C++Segunda parteSegunda parte

Intro. a UML, sobrecarga, Intro. a UML, sobrecarga, polimorfismo, herencia y polimorfismo, herencia y

TemplatesTemplates

Ana Lila Laureano-CrucesAna Lila Laureano-Cruces

Elena Cruz MiguelElena Cruz Miguel

Modelado VisualModelado Visual

Es modelado usando una notación Es modelado usando una notación gráfica estándarizadagráfica estándarizada

Captura las partes esenciales de un Captura las partes esenciales de un sistemasistema

Abstrae la complejidadAbstrae la complejidad El análisis de casos de uso es una El análisis de casos de uso es una

técnica para capturar el proceso del técnica para capturar el proceso del negocio desde la perspectiva del negocio desde la perspectiva del usuariousuario

UMLUML

Lenguaje Unificado de ModeladoLenguaje Unificado de Modelado Estandar para el modelado de Estandar para el modelado de

aplicaciones Orientados a Objetosaplicaciones Orientados a Objetos Es una sintaxis, no una metodologíaEs una sintaxis, no una metodología Proporciona una gran gama de Proporciona una gran gama de

diagramas y la semántica asociada a diagramas y la semántica asociada a esta.esta.

Booch, Rambaugh y Jacobson adoptaron Booch, Rambaugh y Jacobson adoptaron los siguentes objetivos:los siguentes objetivos:

Representar sistemas completos, en Representar sistemas completos, en lugar de solamente la parte de software, lugar de solamente la parte de software, usando conceptos orientados a objetos.usando conceptos orientados a objetos.

Establecer una relación explícita entre Establecer una relación explícita entre conceptos y código ejecutable.conceptos y código ejecutable.

Crear un lenguaje de modelado que Crear un lenguaje de modelado que pudiera ser usado por humanos y pudiera ser usado por humanos y máquinas.máquinas.

VentajasVentajas

UML es el lenguaje estándar para UML es el lenguaje estándar para visualizar, especificar, construir y visualizar, especificar, construir y documentar los productos de un documentar los productos de un sistema de softwaresistema de software

UML se puede usar con todos los UML se puede usar con todos los procesos, a lo largo del ciclo de vida procesos, a lo largo del ciclo de vida de desarrollo y a través de diferentes de desarrollo y a través de diferentes tecnologías de implementacióntecnologías de implementación

DiseñoDiseño

Diagramas Asociados:Diagramas Asociados: - Diagrama de Objetos- Diagrama de Objetos - Diagrama de Clases- Diagrama de Clases - Diagrama de Estados- Diagrama de Estados - Diagrama de Actividades- Diagrama de Actividades - Diagrama de Secuencia- Diagrama de Secuencia - Diagrama de Componentes- Diagrama de Componentes

Fundamental en el diseño y

Documentación de un sistema

Conceptos sobre ClasesConceptos sobre Clases Describe un grupo de objetos conDescribe un grupo de objetos con propiedades similares, con relaciones propiedades similares, con relaciones

comunes y con semántica común (mismos comunes y con semántica común (mismos atributos y patrones de comportamiento)atributos y patrones de comportamiento)

La clase de un objeto es una propiedad La clase de un objeto es una propiedad implícita de sí mismoimplícita de sí mismo

Al agrupar los objetos en clases se Al agrupar los objetos en clases se abstrae el problema, lo que da al modelo abstrae el problema, lo que da al modelo su potencia y capacidad de generalizarsu potencia y capacidad de generalizar

Diagramas de ClaseDiagramas de Clase

• • Atributos: es una propiedad del Atributos: es una propiedad del elemento, que es compartida por elemento, que es compartida por todos los objetos, y describe una todos los objetos, y describe una característica.característica.

• • Operaciones: es la implementación Operaciones: es la implementación de un servicio que muestra el de un servicio que muestra el comportamiento de la clase.comportamiento de la clase.

Un diagrama de clases se compone Un diagrama de clases se compone de un rectangulo dividido en tres de un rectangulo dividido en tres seccionessecciones

NombreDeClase

Sección de atributos

Sección de operaciones

Usuario

-nombre-edad-fechaNacimiento

+agregarUsuario+borrarUsuario+modificarUsuario

Nombre de la clase

Atributos ocaracterísticas

Comportamiento uoperaciones

visibilidad

- son privados+ son públicos

Sintaxis compactaSintaxis compacta

UsuarioAutentificaUsuario

Navegabilidad

Indica el sentido valido de recorrido

Asociación

Indica cómo esta relacionada una clase con otra

SobrecargaSobrecarga

SobrecargaSobrecarga

La sobrecarga permite definir varias La sobrecarga permite definir varias funciones que:funciones que: Tienen el mismo nombreTienen el mismo nombre El número de parámetros que reciben es El número de parámetros que reciben es

distintodistinto Los tipos de datos de retorno son igualesLos tipos de datos de retorno son iguales Los tipos de datos de los parámetros Los tipos de datos de los parámetros

pueden ser distintospueden ser distintos

SobrecargaSobrecarga

int compara(int v1,int v2)int compara(int v1,int v2) {{

if(v1>v2)if(v1>v2) return(1);return(1);

else if(v1<v2)else if(v1<v2) return(-1);return(-1);

elseelse return(0);return(0);

}}

SobrecargaSobrecarga

int compara(char *v1,char *v2)int compara(char *v1,char *v2) {{

for(int i=0;i<strlen(v1);i++)for(int i=0;i<strlen(v1);i++) if(v1[i]==v2[i])if(v1[i]==v2[i])

continue;continue; else if(v1[i]<v2[i])else if(v1[i]<v2[i])

return(-1);return(-1); elseelse

return(0);return(0);

return (if(strlen(v1)==strlen(v2)?0:-1;return (if(strlen(v1)==strlen(v2)?0:-1; }}

Sobrecarga con funcionesSobrecarga con funciones Si se utilizan parámetros con valores Si se utilizan parámetros con valores

default, la función puede representarse default, la función puede representarse con un conjunto de funciones:con un conjunto de funciones:

void funcion( int a = 50, float f = 23.45, char c = void funcion( int a = 50, float f = 23.45, char c = 'q' );'q' );

El conjunto de funciones equivalentes es:El conjunto de funciones equivalentes es:void funcion ( );void funcion ( );

void funcion( int );void funcion( int );

void funcion ( int, float );void funcion ( int, float );

void funcion ( int, float, char );void funcion ( int, float, char );

Sobrecarga de Sobrecarga de OperadoresOperadores

La sobrecarga del operador se asocia La sobrecarga del operador se asocia con la semanticacon la semantica

Se mantiene la presedencia y Se mantiene la presedencia y asociatividad en los operadoresasociatividad en los operadores

Se pueden definir formas de prefijos y Se pueden definir formas de prefijos y postfijos del mismo operador postfijos del mismo operador

Sobrecarga con Sobrecarga con Operadores Operadores

Operadores que pueden ser sobrecargadosOperadores que pueden ser sobrecargados RelacionalesRelacionales

>, <, <=, >=, !=, ==>, <, <=, >=, !=, == AritméticosAritméticos

+, -, *, /, %, ^+, -, *, /, %, ^ A nivel de bitsA nivel de bits

&, |, ~, !, <<, >>, &, |, ~, !, <<, >>, AsignaciónAsignación

=, +=, -=, *=, /=, %=, ^=, &=, |=, <<=, >>==, +=, -=, *=, /=, %=, ^=, &=, |=, <<=, >>= OtrosOtros

, &&, ||, ++, --, ->, [ ], ( ), new, delete, &&, ||, ++, --, ->, [ ], ( ), new, delete

EjemploEjemplo Sobrecarga del operador + entre numeros Sobrecarga del operador + entre numeros

imaginarios.imaginarios.

Imaginario Imginario::operator + (Imaginario i)Imaginario Imginario::operator + (Imaginario i)

{{Imaginario mi = *this;Imaginario mi = *this;

return Imaginario( im.p_real + i.p_real, return Imaginario( im.p_real + i.p_real,

im.p_imaginaria + im.p_imaginaria + i.p_imaginaria );i.p_imaginaria );

}}

PolimorfismoPolimorfismo

PolimorfismoPolimorfismo

Muchas formasMuchas formas A un mismo mensaje distinto A un mismo mensaje distinto

comportamientocomportamiento

Overriding o Redefinición Overriding o Redefinición de Funcionesde Funciones

Overriding es redefinir una función en Overriding es redefinir una función en una clase derivada:una clase derivada: mismo nombre de la función.mismo nombre de la función. mismo tipo y número de argumentos.mismo tipo y número de argumentos. mismo tipo de retorno en una clase mismo tipo de retorno en una clase

derivada.derivada.

EjemploEjemplo

class Userclass User

{{

public:public:

......

virtual int getPermissions() const;virtual int getPermissions() const;

......

}}

class Employee :public Userclass Employee :public User

{ ... }{ ... }

int Employee::getPermissions() constint Employee::getPermissions() const

{{

cout << “ Permisos Empleado\n”cout << “ Permisos Empleado\n”

}}

igual númeroy tipo deargumentos

igual tipo deretorno

Sobrecarga y Sobrecarga y sobreescriturasobreescritura

La sobrecarga se refiere a crear funciones del La sobrecarga se refiere a crear funciones del mismo nombre, pero con diferente tipo y mismo nombre, pero con diferente tipo y número de argumentos y valor de retorno número de argumentos y valor de retorno dentro de una misma clase derivada o subclase.dentro de una misma clase derivada o subclase. Las funciones resultantes son independientes Las funciones resultantes son independientes

entre sí.entre sí. La redefinición redefine una función en la clase La redefinición redefine una función en la clase

derivada con mismo tipo y número de derivada con mismo tipo y número de argumentos, y valor de retorno.argumentos, y valor de retorno. Las funciones resultantes se sobreescriben Las funciones resultantes se sobreescriben

entre sí.entre sí.

PolimorfismoPolimorfismo El polimorfismo es una de las características El polimorfismo es una de las características

centrales de la programación orientada a centrales de la programación orientada a objetos, junto con el encapsulamiento y la objetos, junto con el encapsulamiento y la herencia.herencia.

Significa que un objeto responderá a una Significa que un objeto responderá a una función de acuerdo a la definición propia que función de acuerdo a la definición propia que tiene para ese método.tiene para ese método.

Polimorfismo en C++Polimorfismo en C++

El polimorfismo en C++ trabaja sobre El polimorfismo en C++ trabaja sobre métodos heredados y/o redefinidos métodos heredados y/o redefinidos ( overriden ).( overriden ).

EjemploEjemplo

class Userclass User { ...{ ... virtual int getPermissions() const;virtual int getPermissions() const; }}

class Employee :public Userclass Employee :public User{ ... }{ ... }int Employee::getPermissions() constint Employee::getPermissions() const{{ cout << “ Permisos Empleado\n” }cout << “ Permisos Empleado\n” }

EjemploEjemplo

User user1, *user2;User user1, *user2;

Employee employee1;Employee employee1;

user2 = &employee;user2 = &employee;

user1.getPermissions(); user1.getPermissions(); // User.// User.

employee1.getPermissions(); employee1.getPermissions(); // Employee.// Employee.

Ejemplo - ( 3 de 3 ) Ejemplo - ( 3 de 3 )

int main(void )int main(void )

{{

Usuario *persons[]={new Usuario(2),Usuario *persons[]={new Usuario(2),

new Empleado(15),new Administrador(500)};new Empleado(15),new Administrador(500)};

showPermissions( persons );showPermissions( persons );

}}

void showPermissions( Usuario *usuarios[] )void showPermissions( Usuario *usuarios[] )

{{

for( int i = 0; i < 3; i++ )for( int i = 0; i < 3; i++ )

usuarios[i]->getPermisos();usuarios[i]->getPermisos();

cout << endl;cout << endl;

}}

Clases AbstractasClases Abstractas

Una clase abstracta es aquella que Una clase abstracta es aquella que define funciones virtuales puras.define funciones virtuales puras.

Las funciones virtuales puras se Las funciones virtuales puras se definen como:definen como:

virtual void print() const = 0;virtual void print() const = 0;

Herencia en C++Herencia en C++

HerenciaHerencia

Propiedad que permite crear nuevas Propiedad que permite crear nuevas clases a partir de las clases clases a partir de las clases existentesexistentes

Conserva las propiedades de la clase Conserva las propiedades de la clase original y añade nuevas original y añade nuevas característicascaracterísticas

Usado para la resolución de Usado para la resolución de problemas complejosproblemas complejos

RecomendacionesRecomendaciones

Buscar categorías, propiedades Buscar categorías, propiedades comunes y distintas que nos comunes y distintas que nos permitan clasificar los objetos.permitan clasificar los objetos.

Clase Base y Clase Clase Base y Clase DerivadaDerivada

Se le llama Clase Base a la clase de Se le llama Clase Base a la clase de la cuál van a heredar las demás.la cuál van a heredar las demás.

Se llama clase derivada a las clases Se llama clase derivada a las clases creadas a partir de una clase base.creadas a partir de una clase base.

Clase DerivadaClase Derivada

Una clase derivada hereda todos los Una clase derivada hereda todos los miembros de la clase base y miembros de la clase base y puede puede accederacceder a los miembros públicos a los miembros públicos ((publicpublic) y protegidos () y protegidos (protectedprotected) de ) de la clase o clases base, como si fueran la clase o clases base, como si fueran miembros de ella misma. Una clase miembros de ella misma. Una clase derivada derivada nono tiene acceso a los tiene acceso a los miembros privados (miembros privados (privateprivate) de la ) de la clase base.clase base.

EjemploEjemplo

PersonaPersona Propiedades comunesPropiedades comunes

NombreNombre Fecha de nacimientoFecha de nacimiento GeneroGenero Estado civilEstado civil

EmpleadoEmpleado Características adicionalesCaracterísticas adicionales

SueldoSueldo Número empleadoNúmero empleado AreaArea

AlumnoAlumno Características adicionalesCaracterísticas adicionales

MatriculaMatricula LicenciaturaLicenciatura

Jerarquía de ClasesJerarquía de Clases

Persona

Empleado Estudiante

Administrativo Académico

Modelado UMLModelado UML

ClaseBase

Sección de atributos

Sección de funciones

ClaseDerivada

Sección de atributos

Sección de funciones

Modelado UMLModelado UMLPersona

- nombre- edad- fechaNacimiento

Sección de funciones

Empleado

- idEmpleado- sueldo- area

Sección de funciones

Diagrama de clases

SintaxisSintaxis

Para la declaración de clases Para la declaración de clases derivadas, encontramos después del derivadas, encontramos después del nombre de la clase derivada, dos nombre de la clase derivada, dos puntos (:) , y luego alguna de las puntos (:) , y luego alguna de las siguientes palabras clave:siguientes palabras clave: publicpublic privateprivate protectedprotected

class class basebase{{ //Cuerpo de la clase base  //Cuerpo de la clase base };};

class class derivadaderivada :[public/private/..] :[public/private/..] basebase{{ //Cuerpo de la clase derivada //Cuerpo de la clase derivada}; };

Constructores de Clases Constructores de Clases DerivadasDerivadas

Cuando una clase base tiene un constructor y una Cuando una clase base tiene un constructor y una clase derivada también, al crear el objeto, se clase derivada también, al crear el objeto, se llama primero al constructor de la clase base, y llama primero al constructor de la clase base, y cuando la ejecución de éste termina, se llama al cuando la ejecución de éste termina, se llama al constructor de la clase derivada.constructor de la clase derivada.

Gracias a que el constructor de la clase base es Gracias a que el constructor de la clase base es llamado, es posible inicializar la clase base, desde llamado, es posible inicializar la clase base, desde el constructor de la clase derivada. Esto se logra el constructor de la clase derivada. Esto se logra pasando una lista de los constructores de las pasando una lista de los constructores de las clases base, con sus respectivos parámetros. clases base, con sus respectivos parámetros.

Ejemplo PERSO.HEjemplo PERSO.H#ifndef PERSO_H#ifndef PERSO_H#define PERSO_H#define PERSO_H

#include<iostream.h>#include<iostream.h>#include<string.h>#include<string.h>#include<stdlib.h>#include<stdlib.h>

class persona{class persona{ public:public: persona::persona(char *n,int e){persona::persona(char *n,int e){

nombre=new char[strlen(n)+1];nombre=new char[strlen(n)+1]; edad=e;edad=e;

}} const char *LeerNombre(char *n) const;const char *LeerNombre(char *n) const; int LeerEdad() const{int LeerEdad() const{ return edad;return edad; }} protected:protected: char *nombre;char *nombre; int edad;int edad;};};

class empleado:public persona{class empleado:public persona{ public:public: empleado::empleado(char *n,int e,float s):persona(n,e){empleado::empleado(char *n,int e,float s):persona(n,e){

salarioanual=s;salarioanual=s; }} float leersalario() const;float leersalario() const; protected:protected: float salarioanual;float salarioanual;};};

class alumno:public persona{class alumno:public persona{ public:public: alumno::alumno(char *n,int e,double m):persona(n,e){alumno::alumno(char *n,int e,double m):persona(n,e){

matricula=m;matricula=m; }} double leermatricula() const;double leermatricula() const; protected:protected: double matricula;double matricula;};};

#endif#endif

Principal.cppPrincipal.cpp

#include<iostream.h>#include<iostream.h>#include"perso.h"#include"perso.h"#include<conio.h>#include<conio.h>

void main()void main(){ { int edad;int edad; system("cls");system("cls"); alumno edoo("mario",24,20021);alumno edoo("mario",24,20021); edad=edoo.LeerEdad();edad=edoo.LeerEdad(); cout<<edad;cout<<edad; getch();getch();}}

TemplatesTemplatesIntroducciónIntroducción

la programación clásica la programación clásica diferenciación entre los datos y su diferenciación entre los datos y su

manipulación, es decir, entre los datos y manipulación, es decir, entre los datos y el conjunto de algoritmos para el conjunto de algoritmos para manejarlos.  manejarlos. 

Los datos eran tipos muy simples Los datos eran tipos muy simples generalmente los algoritmos estaban generalmente los algoritmos estaban

agrupados en funciones orientadas de agrupados en funciones orientadas de forma muy específica a los datos que forma muy específica a los datos que debían manejar.debían manejar.

IntroducciónIntroducción

La POO introdujo nuevas facilidades:La POO introdujo nuevas facilidades: Extender el concepto de dato, Extender el concepto de dato, permitiendo tipos más complejos a los permitiendo tipos más complejos a los

que se podía asociar la operaciones que se podía asociar la operaciones necesarias. necesarias. 

AdemásAdemás La posibilidad de ocultación de La posibilidad de ocultación de

determinados detalles internos irrelevantes determinados detalles internos irrelevantes para el usuario para el usuario

y la capacidad de herenciay la capacidad de herencia

Programación genéricaProgramación genérica

Se dieron cuenta que Se dieron cuenta que frecuentemente las manipulaciones frecuentemente las manipulaciones contienen un denominador común contienen un denominador común que se repite bajo apariencias que se repite bajo apariencias diversasdiversas criterios de ordenacióncriterios de ordenación validacionesvalidaciones

Los algoritmos deben ser Los algoritmos deben ser parametrizados al máximo.parametrizados al máximo.

Expresados de la forma más Expresados de la forma más independiente posible de detalles independiente posible de detalles concretosconcretos

permitiendo la posibilidad de servir permitiendo la posibilidad de servir para una mayor variedad posible de para una mayor variedad posible de tipos y estructuras de datos.tipos y estructuras de datos.

Algoritmo genérico que permita Algoritmo genérico que permita representar algoritmos con ciertas representar algoritmos con ciertas características comunes características comunes

Definición de los tipos: a que tipos Definición de los tipos: a que tipos pueden aplicarse este algoritmopueden aplicarse este algoritmo

Y sus reglas de uso, independiente.Y sus reglas de uso, independiente.

Las plantillas, que se introdujeron Las plantillas, que se introdujeron con la versión del Estándar de Julio con la versión del Estándar de Julio de 1998de 1998

La idea central a resaltar aquí es que La idea central a resaltar aquí es que una una plantillaplantilla genera la definición de genera la definición de una clase o de una función mediante una clase o de una función mediante uno o varios parámetros.  A esta uno o varios parámetros.  A esta instancia concreta de la clase o instancia concreta de la clase o función se la denomina una función se la denomina una especializaciónespecialización o o especialidadespecialidad de de la plantilla.la plantilla.

C++ utiliza una palabra clave específica C++ utiliza una palabra clave específica templatetemplate para declarar y definir funciones para declarar y definir funciones y clases genéricas.  y clases genéricas. 

En estos casos actúa como un especificador En estos casos actúa como un especificador de tipo y va unido al par de ángulos de tipo y va unido al par de ángulos < >< > que delimitan los argumentos de la que delimitan los argumentos de la plantilla:plantilla: template <T> void fun(T& ref);      // template <T> void fun(T& ref);      //

declaración de función genéricadeclaración de función genérica template <T> class C {/*...*/};     // declaración template <T> class C {/*...*/};     // declaración

de clase genéricade clase genérica

#include #include #include #include #include #include class ObjetoGenerico {class ObjetoGenerico { public:public: virtual void Dibuja() {};virtual void Dibuja() {}; };};

class Circulo : public ObjetoGenerico {class Circulo : public ObjetoGenerico { int x, y, r;int x, y, r; public:public: Circulo(int xi=100, int yi=100, int ri=100) Circulo(int xi=100, int yi=100, int ri=100) { x=xi ; y=yi; r=ri;}{ x=xi ; y=yi; r=ri;} void Dibuja() void Dibuja() { circle(x, y, r); }{ circle(x, y, r); } };};

class Elipse : public ObjetoGenerico {class Elipse : public ObjetoGenerico {int x, y, rx, ry;int x, y, rx, ry;public:public:Elipse(int xi=100, int yi=100, int rxi=60, int ryi=80)Elipse(int xi=100, int yi=100, int rxi=60, int ryi=80) { x=xi; y=yi; rx=rxi; ry=ryi; }{ x=xi; y=yi; rx=rxi; ry=ryi; }void Dibuja() void Dibuja() { ellipse(x, y, 0, 360, rx, ry) ; }{ ellipse(x, y, 0, 360, rx, ry) ; }};};class Rectangulo : public ObjetoGenerico {class Rectangulo : public ObjetoGenerico {int xizq, yarriba, ancho, alto;int xizq, yarriba, ancho, alto;public:public:Rectangulo(int xi=10, int yi=10, int an=40, int al=60)Rectangulo(int xi=10, int yi=10, int an=40, int al=60){ xizq=xi; yarriba=yi;ancho=an; alto=al; }{ xizq=xi; yarriba=yi;ancho=an; alto=al; }void Dibuja()void Dibuja() { rectangle(xizq, yarriba, xizq+ancho, yarriba+alto); }{ rectangle(xizq, yarriba, xizq+ancho, yarriba+alto); }};};

class Nodo {class Nodo {ObjetoGenerico *figura;ObjetoGenerico *figura;Nodo *sig;Nodo *sig;public:public:Nodo(ObjetoGenerico *fig)Nodo(ObjetoGenerico *fig) { figura=fig; }{ figura=fig; }Nodo * RecuperaSiguiente()Nodo * RecuperaSiguiente() { return sig; }{ return sig; }void PonerSiguiente(Nodo *nodosig)void PonerSiguiente(Nodo *nodosig) { sig=nodosig; }{ sig=nodosig; }void Muestra()void Muestra() { figura->Dibuja(); }{ figura->Dibuja(); }};};

class Lista {class Lista {Nodo *cabeza;Nodo *cabeza;public:public:Lista()Lista(){ cabeza=new Nodo(NULL); cabeza->PonerSiguiente(NULL); }{ cabeza=new Nodo(NULL); cabeza->PonerSiguiente(NULL); }void Insertar (ObjetoGenerico *fig);void Insertar (ObjetoGenerico *fig);void Desplegar();void Desplegar();};};void Lista::Insertar(ObjetoGenerico *fig)void Lista::Insertar(ObjetoGenerico *fig){{ Nodo *aux;Nodo *aux; For(aux=cabeza; aux->RecuperaSiguiente()!=NULL; aux=aux-For(aux=cabeza; aux->RecuperaSiguiente()!=NULL; aux=aux-

>RecuperaSiguiente());>RecuperaSiguiente()); Nodo *nuevo = new Nodo(fig);Nodo *nuevo = new Nodo(fig); nuevo->PonerSiguiente(NULL);nuevo->PonerSiguiente(NULL); aux->PonerSiguiente(nuevo);aux->PonerSiguiente(nuevo);}}void Lista::Desplegar()void Lista::Desplegar(){ Nodo *aux;{ Nodo *aux;for(aux=cabeza->RecuperaSiguiente(); aux!=NULL; aux=aux-for(aux=cabeza->RecuperaSiguiente(); aux!=NULL; aux=aux-

>RecuperaSiguiente())>RecuperaSiguiente())aux->Muestra();aux->Muestra();}}

void main()void main() {{ int graphdriver = DETECT, graphmode;int graphdriver = DETECT, graphmode; initgraph(&graphdriver, &graphmode, "..\\bgi");initgraph(&graphdriver, &graphmode, "..\\bgi"); Lista ListaFig;Lista ListaFig; Circulo *c1 = new Circulo(50,50,80);Circulo *c1 = new Circulo(50,50,80); ListaFig.Insertar(c1);ListaFig.Insertar(c1); Elipse *e1 = new Elipse;Elipse *e1 = new Elipse; ListaFig.Insertar(e1);ListaFig.Insertar(e1); Rectangulo *r1 = new Rectangulo(30,50);Rectangulo *r1 = new Rectangulo(30,50); ListaFig.Insertar(r1);ListaFig.Insertar(r1); ListaFig.Desplegar();ListaFig.Desplegar(); closegraph();closegraph(); }}