[C con Clase] "Punteros" a clase

Rafael Arias Michel rgam496 en gmail.com
Mie Oct 24 02:50:49 CEST 2012


Gracias por su respuesta.

Sí, sé que el polimorfismo te permite muchas cosas.

Sé que puede realizarse lo siguiente con polimorfismo:
A *varB = new B();
A *varC = new C();

Pero mi duda es si puedo realizar algo similar a esto:
pA = B;
A *varB = new pA; // A *varB = new B();
pA = C;
A *varC = new pA // A *varC = new C();

Considerando que B y C heredan propiedades de A.

Sucede que estoy con un proyecto en el cual quiero dar a elegir al usuario
cuál clase se empleará para construir una serie de objetos, de modo que la
clase elegida pase a ser pA. Se podrá elegir siempre de cualquier clase que
sea una extensión de clase A.
Cada objeto que cree debe ser del tipo indicado por pA, y no está
previamente definido cuántos podré crearlos.
En un menú de opciones daré a elegir qué clase querrá usar (si será la B o
la C).

Daré otro ejemplo de lo que pretendo, con algo más concreto:

class A
{
virtual double f(double x);
};

class B: public A
{
double f(double x) {return 5;}
};

class C: public A
{
double n = 0;
double f(doble x) {return n++;}
}

Si en el menú indico que usaré siempre la clase B, entonces pA deberá hacer
referencia a B, de modo que:
A *var[4];
for (int i = 0; i < 4; i++)
var[i] = new pA();
Entonces, si yo ejecuto var[3].f(7), me devolverá 5. Ahora, si pA hacía
referencia a C:
var[2].f(3) me devolverá 0.
var[1].f(5) me devolverá 0.
var[2].f(2) me devolverá 1.
var[0].f(2) me devolverá 0.

¿De qué modo podría yo implementar a pA en C++? En caso de no ser posible,
¿qué sería lo más cercano a pA? ¿Tendré que usar punteros a funciones para
crear nuevos objetos de clases generalizables por A, o hay otra estrategia?

Espero haber expresado correctamente mi duda.

Cordiales saludos.

Rafael Arias Michel

El 23 de octubre de 2012 13:53, Davidson, Steven <srd4121 en njit.edu>escribió:

> Hola Rafael,
>
> 2012/10/23 Rafael Arias Michel <rgam496 en gmail.com>:
> >
>
> [CORTE]
>
> > Vemos que f es un puntero a función, que me da la libertad de elegir qué
> > algoritmo usaré para calcular los valores a graficar.
> >
> > Del mismo modo, quería diseñar pA de tal modo que me permita elegir qué
> > clase usar, siempre que sea A una generalización de esa clase.
> >
>
> Lo que describes es justamente el polimorfismo, que te ha sugerido
> User. Debes crear una clase virtual que sirva de pariente para una
> jerarquía de clases. Para usar esta generalización de clases, creamos
> o bien punteros a objetos o bien referencias a ellos para comenzar el
> polimorfismo. Internamente, se aplica este cambio de puntero para que
> elija el conjunto de funciones del tipo correcto. Esto sería,
>
> class A {...};
> class B : public A {...};
> class C : public A {...};
> ...
> A objA;
> B objB;
> C objC;
>
> A *ptr = &objA;
> ptr->graficar();
>
> ptr = &objB;
> ptr->graficar();
>
> ptr = &objC;
> ptr->graficar();
>
> Si no quieres usar polimorfismo, pero quieres hacer algo parecido,
> quizá más al estilo C, entonces podrías "jugar" con los tipos de
> punteros y realizar cástings. Por ejemplo,
>
> struct A {...};
> struct B { A obj; ...};
> struct C { A obj; ...};
> ...
> A objA;
> B objB;
> C objC;
>
> A *ptr = &objA;
> ptr->graficar();
>
> ptr = (A *) &objB;
> ((B *)ptr)->graficar();
>
> ptr = (A *) &objC;
> ((C *)ptr)->graficar();
>
> Nuevamente, esto ya existe en C++ a través de la POO como la herencia
> y más sofisticadamente con el polimorfismo.
>
>
> Espero haber aclarado la duda.
>
> Steven
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121023/c48cc777/attachment.html>


Más información sobre la lista de distribución Cconclase