[C con Clase] "Punteros" a clase

Davidson, Steven srd4121 en njit.edu
Dom Oct 28 04:40:06 CET 2012


Hola Rafael,

2012/10/23 Rafael Arias Michel <rgam496 en gmail.com>:
> 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.
>

Dinámicamente, C++ no te permite tal manejo de tipos, porque los tipos
no se guardan en el programa compilado. Lo que sí podrías hacer es
obligar a C++ a usar la RTTI: Información de Tipo en Tiempo de
Ejecución. Con esto, puedes consultar acerca de los tipos, pero sigue
siendo un manejo limitado, ya que te permite determinar si los tipos
son iguales o no.

> 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).
>

La terminología que estás usando describe la POO y el polimorfismo a
la perfección.

> 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?
>

Como he mencionado antes, esto es justamente la idea tras el
polimorfismo, pero no tenemos que saber el tipo de dato para poder
invocar la función miembro debida, sino que el mecanismo de
polimorfismo ya toma en cuenta esto y elige correctamente la función
que queremos. En tu menú, instancia el objeto polimórfico de la clase
correcta según la elección del usuario y el comportamiento de tu
programa. Por ejemplo,

A *pObj;

int opcion;
cin >> opcion;

switch( opcion )
{
  case 1:
    pObj = new A;
    ...
  break;

  case 2:
    pObj = new B;
    ...
  break;

  case 3:
    pObj = new C;
    ...
  break;
}

Después de esto, ya puedes invocar las funciones miembro que quieres,
y el sistema de polimorfismo elegirá la "versión correcta" de cada
función miembro. Todo esto sucede sin necesidad de manipular
directamente los tipos de datos; sólo invocamos las funciones que
queremos, y el polimorfismo se encarga de elegir los detalles ya
definidos.


Espero que esto te ayude.

Steven




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