Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivos:
Lograr que los estudiantes:
1. Apliquen el concepto del polimorfismo en la solución de problemas.
2. Desarrollen habilidades en la definición e implementación de clases donde se
haga uso del contenido relacionado con la herencia y el polimorfismo.
Sumario:
Resolución de ejercicios.
o Identificación de la relación es-un entre clases.
o Implementación del polimorfismo en C++.
Introducción
Desarrollo
Ejercicio # 1
En el Museo Nacional de Bellas Artes se realiza un control estricto de todas las obras allí
expuestas. De toda obra se conoce el año de terminada, autor, fecha de ingreso al museo y
un valor base de la misma. Las obras pueden estar especializadas en: Pintura o Escultura. Si
la obra es una pintura, se conoce además sus dimensiones (largo x ancho), tipo de pintura
utilizada, material sobre el que se pintó y la técnica utilizada; en el caso de las esculturas, se
conoce además el material en que se modeló, su peso y su volumen aproximados. Para
lograr este control estricto el museo tiene archivado una ficha con la información de cada
obra.
Variante de solución:
1
Declaración de las funciones virtuales
Antes Después
protected: protected:
char * tipo; char * tipo;
char ficha[200]; char ficha[200];
char * conv(int); char * conv(int);
char * conv(float); char * conv(float);
public: public:
Obra(int, char *, Obra(int, char *,
const Fecha &, float); const Fecha &, float);
char * getTipo(); char * getTipo();
char * Autor(); char * Autor();
void setAutor(char *); void setAutor(char *);
float ValorBase(); float ValorBase();
void setValorBase(float); void setValorBase(float);
int AnnoTerminacion(); int AnnoTerminacion();
void setAnnoTerminacion(int); void setAnnoTerminacion(int);
char * FichaTecnica(); virtual char * FichaTecnica();
~Obra(); virtual ~Obra();
}; };
public: public:
Pintura(int, char*, const Fecha&, Pintura(int, char*, const Fecha&,
float, float, float, char*, float, float, float, char*,
char*, char*); char*, char*);
float Largo(); float Largo();
void setLargo(float); void setLargo(float);
float Ancho(); float Ancho();
void setAncho(float); void setAncho(float);
char * TipoPintura(); char * TipoPintura();
void setTipoPintura(char *); void setTipoPintura(char *);
char * Material(); char * Material();
void setMaterial(char *); void setMaterial(char *);
char * Tecnica(); char * Tecnica();
void setTecnica(char *); void setTecnica(char *);
char * FichaTecnica(); virtual char * FichaTecnica();
~Pintura(); virtual ~Pintura();
}; };
2
class Escultura : public Obra { class Escultura : public Obra {
private: private:
char* materialM; char* materialM;
float peso, volumen; float peso, volumen;
public: public:
Escultura(int, char*, const Fecha&, Escultura(int, char*, const Fecha&,
float, char*, float, float); float, char*, float, float);
char* MaterialMoldeado(); char* MaterialMoldeado();
void setMaterialMoldeado(char*); void setMaterialMoldeado(char*);
float Peso(); float Peso();
void setPeso(float); void setPeso(float);
float Volumen(); float Volumen();
void setVolumen(float); void setVolumen(float);
char* FichaTecnica(); virtual char* FichaTecnica();
~Escultura(); virtual ~Escultura();
}; };
if (strcmp(tipoObra, "pintura")==0)
cout<<((Pintura*)obras[i])
->FichaTecnica();
else if (strcmp(tipoObra,
"escultura")==0)
cout<<((Escultura*)obras[i])
->FichaTecnica();
else
cout<<obras[i]->FichaTecnica();
}
}
Museo::~Museo() Museo::~Museo()
{ {
for (int i = 0; i < cantReal; i++) for (int i = 0; i < cantReal; i++)
{ delete obras[i];
char* tipoObra = delete [] obras;
obras[i]->getTipo(); }
if (strcmp(tipoObra, "pintura")==0)
delete (Pintura*)obras[i];
else if (strcmp(tipoObra,
"escultura")==0)
delete (Escultura*)obras[i];
else
delete obras[i];
}
delete [] obras;
}
3
Ejercicio # 2
Se quiere conformar un equipo de fútbol a partir de cierto presupuesto para el pago de los
jugadores. Los jugadores pueden ser juveniles o mayores, representados mediante la
siguiente jerarquía de clases.
Juvenil
juegos
Juvenil
Pago
Mayor
goles
Mayor
Pago
class Equipo
{
Juvenil* jugadores[20];
int cantidad;
double presupuesto, prUsado;
public:
Equipo(double presup);
// Crear método Contratar
…
}
4
Cree un equipo vacío.
Cree jugadores con datos entrados por consola, estos puede ser de tipo Juvenil o
Mayor a opción del usuario.
Después de crear el equipo, imprima el total de dinero que se les paga a los jugadores
mayores.
Variante de solución:
Archivo juvenil.h
#ifndef juvenilH
#define juvenilH
class Juvenil
{
int juegos;
public:
Juvenil(int);
virtual ~Juvenil(){}
virtual double Pago();
int Juegos();
};
#endif
Archivo juvenil.cpp
#include "juvenil.h"
Juvenil::Juvenil(int j)
{
if(j > 0)
juegos = j;
}
double Juvenil::Pago()
{
return juegos * 5;
}
int Juvenil::Juegos()
{
return juegos;
}
Archivo mayor.h
#ifndef mayorH
#define mayorH
#include "juvenil.h"
class Mayor : public Juvenil
{
int goles;
public:
Mayor(int, int);
virtual ~Mayor(){}
virtual double Pago();
5
};
#endif
Archivo mayor.cpp
#include "mayor.h"
double Mayor::Pago()
{
double p = 500 * (double)(goles / Juegos());
if (p < 400)
p = 400;
return p;
}
Archivo equipo.h
#ifndef equipoH
#define equipoH
#include "mayor.h"
class Equipo
{
Juvenil* jugadores[20];
int cantidad;
double presupuesto, prUsado;
public:
Equipo(double presup);
~Equipo();
bool Contratar(Juvenil*);
double PagoTotalMayores();
};
#endif
Archivo equipo.cpp
#include "equipo.h"
#include <typeinfo>
Equipo::Equipo(double presup)
{
for (int i = 0; i < 20; i++)
jugadores[i] = 0;
cantidad = 0;
prUsado = 0;
if(presup > 0)
presupuesto = presup;
}
6
Equipo::~Equipo()
{
for (int i = 0; i < cantidad; i++)
delete jugadores[i];
}
return false;
}
double Equipo::PagoTotalMayores()
{
double suma = 0;
return suma;
}
Archivo main.h
#include <iostream.h>
#include "equipo.h"
int main()
{
int presupuesto;
cout << "Introduzca el presupuesto del cual dispone el equipo: ";
cin >> presupuesto;
Equipo E(presupuesto);
Juvenil* J;
char opcion, tipo;
cout << "\nPara introducir un jugador presione cualquier tecla, para terminar (t): ";
cin >> opcion;
opcion = tolower(opcion);
7
} while (tipo != 'J' && tipo != 'M');
do {
cout << "Entre la cantidad de juegos de por vida: ";
cin >> juegos;
} while (juegos <= 0);
if (tipo == 'J')
J = new Juvenil(juegos);
else {
do {
cout << "Entre la cantidad de goles: ";
cin >> goles;
} while (goles < 0);
if (E.Contratar(J))
cout << "El jugador fue contratado.\n";
else
cout << "El jugador no fue contratado.\n";
cout << "\nPara introducir un jugador presione cualquier tecla, para terminar (t): ";
cin >> opcion;
}
cout << "Total de dinero que se les paga a los jugadores mayores: " << E.PagoTotalMayores() << endl;
system("pause");
return 0;
}
Conclusiones
8
En esta clase continuamos la ejercitación de los contenidos vistos en la conferencia,
identificando clases y dentro de estas las funciones virtuales; dándosele solución a diferentes
problemas donde se manifestaba la herencia y el polimorfismo.
Ejercicio propuesto
En una base de transporte se registran dos tipos de vehículos, los terrestres y los aéreos,
representados mediante la siguiente jerarquía de clases:
Vehiculo
marca
Vehiculo
NecesitaMantenimiento
VTerrestre VAereo
kilometraje horasVuelo
VTerrestre VAereo
NecesitaMantenimiento NecesitaMantenimiento
class BaseTransporte
{
Vehiculo* lista[100];
int cantidad;
// Crear el constructor y el destructor.
};
En el programa principal realice lo siguiente:
Cree una base de transporte vacía.
Cree un vehículo con datos entrados por consola, el transporte puede ser de tipo
VTerrestre o VAereo a opción del usuario.
Agregue el vehículo a la base de transporte.