Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ¡Micronet! en 21 Octubre 2010, 00:54 am



Título: POLIMORFISMO!!! (Resuelto)
Publicado por: ¡Micronet! en 21 Octubre 2010, 00:54 am
#include <iostream.h>
#include <conio.h>

class Figura {
public:
virtual void Dibujar () = 0;
};

class Punto : public Figura {
protected:
int x, y;

public:
Punto (int _x, int _y);

virtual void Dibujar ();
};

Punto::Punto (int _x, int _y)
{
x = _x;
y = _y;
}

void Punto::Dibujar ()
{
gotoxy (x, y);
cout << "*";
}

class Rectangulo : public Figura {
protected:
int x1, y1, x2, y2;

public:
Rectangulo (int _x1, int _y1, int _x2, int _y2);

virtual void Dibujar ();
};

Rectangulo::Rectangulo (int _x1, int _y1, int _x2, int _y2)
{
x1 = _x1;
y1 = _y1;
x2 = _x2;
y2 = _y2;
}

void Rectangulo::Dibujar ()
{
gotoxy (x1, y1);
for (int i = x1; i <= x2; i++)
cout << "*";
gotoxy (x1, y2);
for (int i = x1; i <= x2; i++)
cout << "*";
for (int i = y1 + 1; i < y2; i++){
gotoxy (x1, i);
cout << "*";
gotoxy (x2, i);
cout << "*";
}
}

void main ()
{
const int Max = 3;
Figura * * Figuras = new Figura * [Max];
Figuras
  • = new Punto (1,1);
Figuras [1] = new Rectangulo (3,3,10,10);
Figuras [2] = new Punto (12,12);
for (int i = 0; i < Max; i++)
Figuras ->Dibujar ();
cout << endl << "Pulse una tecla para terminar ...";
getch ();
}





Alguien me puede explicar este programa ¿?
esta basado en polimorfismo pero no le entiendo por mas que intento
lo encontre en 'Yahoo Preguntas' por si acaso creen que es mi tarea.
pero no lo es.

Es un ayuda personal para comprender mejor el polimorfismo


Título: Re: POLIMORFISMO!!!
Publicado por: MazarD en 21 Octubre 2010, 09:51 am
La idea del polimorfismo en POO es que puedes utilizar una función o tipo de una clase como si fuera de otra clase.

En tu ejemplo:

-Empiezas creando la clase abstracta Figura con un método virtual puro Dibujar, con esto obligarás a que las clases derivadas implementen el método.
De todos modos si la clase no fuera abstracta (si proporcionaras implementación al método virtual) después con la sobrecarga habría de todos modos polimorfismo...

-Creas una clase rectángulo y una clase punto que heredan de Figura y que implementan Dibujar, cada una con su constructor, métodos y tal.

-Finalmente se ve la utilidad en el main. Creas un array de figuras (la clase base), en una de las figuras asignas un punto, en otra un rectangulo y otro punto.
Después en el bucle si te fijas estás llamando siempre a Figuras->Dibujar(); pero dependiendo de la instancia a la que se refiera, Figuras se estará comportando como un punto o un rectangulo y generará el dibujo correspondiente. Sin polimorfismo esto no sería posible.

Saludos!

//edit
PD: Deberías utilizar la etiqueta code para postear código y que sea más legible.


Título: Re: POLIMORFISMO!!!
Publicado por: klaussius en 22 Octubre 2010, 16:37 pm
Imagínate objeto "Soldado_Con_Escopeta", y ahora imagínate al "sargento Main" señalándole, y diciendo "¡¡¡¡Soldado_Con_Escopeta.fuego(); !!!!". El soldado con escopeta dispara.

Ahora imagínate un objeto "Soldado_Con_Un_Mechero", y el "sargento Main" haciendo lo mismo "¡¡¡¡Soldado_Con_Un_Mechero.fuego(); !!!!". El soldado del mechero se lo tiende para encenderle un cigarro.

Aunque la orden del sargento ha sido la misma, cada uno ha reaccionado de una forma distinta. ¿Cómo ha sabido cada uno de los soldados lo que tenía que hacer, dos cosas distintas habiendo recibido ambos la misma orden?

Aunque la orden sea la misma, el soldado al que se refiere es distinto, y cada uno tiene definida una función distinta para reaccionar al escuchar la palabra "fuego". En otras palabras, en el mundo del C++ puedes tener todas las clases que quieras que respondan a la orden "fuego", siempre y cuando le digas a cada una lo que tiene que hacer cuando escuche la orden, y cada uno de los soldados obedecerá dependiendo de lo que él entienda que debe hacer, que no es ni más ni menos que lo que has definido.


Título: Re: POLIMORFISMO!!!
Publicado por: ¡Micronet! en 23 Octubre 2010, 01:52 am


   MazarD & klaussius


Gracias compañeros ya entendi :)...