Muchas gracias por su respuesta, Steven.<div><br></div><div>Podrá apreciar que justamente quería evitar el uso la estructura switch, je, je.</div><div><br></div><div>Consideré como posible reemplazo, utilizando punteros a funciones, diseñar funciones como:</div>
<div><br></div><div>typedef A* (*GeneradorA)();</div><div><br></div><div>A* GenerarNuevaB() {return new B();}</div><div>C* GenerarNuevaC() {return new C();}</div><div><br></div><div>¿Será válido lo siguiente?</div><div><br>
</div><div>GeneradorA fA;</div><div>fA = GenerarNuevaB;</div><div>A* varB = fA();</div><div>fA = GenerarNuevaC;</div><div>A* varC = fA();</div><div><br></div><div><br></div><div>Una vez más, muchas gracias por toda su ayuda.</div>
<div><br></div><div>Saludos.</div><div><br></div><div><br><div class="gmail_quote">El 28 de octubre de 2012 00:40, Davidson, Steven <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Hola Rafael,<br>
<br>
2012/10/23 Rafael Arias Michel <<a href="mailto:rgam496@gmail.com">rgam496@gmail.com</a>>:<br>
</div><div class="im">> Gracias por su respuesta.<br>
><br>
> Sí, sé que el polimorfismo te permite muchas cosas.<br>
><br>
> Sé que puede realizarse lo siguiente con polimorfismo:<br>
> A *varB = new B();<br>
> A *varC = new C();<br>
><br>
> Pero mi duda es si puedo realizar algo similar a esto:<br>
> pA = B;<br>
> A *varB = new pA; // A *varB = new B();<br>
> pA = C;<br>
> A *varC = new pA // A *varC = new C();<br>
><br>
> Considerando que B y C heredan propiedades de A.<br>
><br>
<br>
</div>Dinámicamente, C++ no te permite tal manejo de tipos, porque los tipos<br>
no se guardan en el programa compilado. Lo que sí podrías hacer es<br>
obligar a C++ a usar la RTTI: Información de Tipo en Tiempo de<br>
Ejecución. Con esto, puedes consultar acerca de los tipos, pero sigue<br>
siendo un manejo limitado, ya que te permite determinar si los tipos<br>
son iguales o no.<br>
<div class="im"><br>
> Sucede que estoy con un proyecto en el cual quiero dar a elegir al usuario<br>
> cuál clase se empleará para construir una serie de objetos, de modo que la<br>
> clase elegida pase a ser pA. Se podrá elegir siempre de cualquier clase que<br>
> sea una extensión de clase A.<br>
> Cada objeto que cree debe ser del tipo indicado por pA, y no está<br>
> previamente definido cuántos podré crearlos.<br>
> En un menú de opciones daré a elegir qué clase querrá usar (si será la B o<br>
> la C).<br>
><br>
<br>
</div>La terminología que estás usando describe la POO y el polimorfismo a<br>
la perfección.<br>
<div class="im"><br>
> Daré otro ejemplo de lo que pretendo, con algo más concreto:<br>
><br>
> class A<br>
> {<br>
> virtual double f(double x);<br>
> };<br>
><br>
> class B: public A<br>
> {<br>
> double f(double x) {return 5;}<br>
> };<br>
><br>
> class C: public A<br>
> {<br>
> double n = 0;<br>
> double f(doble x) {return n++;}<br>
> }<br>
><br>
> Si en el menú indico que usaré siempre la clase B, entonces pA deberá hacer<br>
> referencia a B, de modo que:<br>
> A *var[4];<br>
> for (int i = 0; i < 4; i++)<br>
> var[i] = new pA();<br>
> Entonces, si yo ejecuto var[3].f(7), me devolverá 5. Ahora, si pA hacía<br>
> referencia a C:<br>
> var[2].f(3) me devolverá 0.<br>
> var[1].f(5) me devolverá 0.<br>
> var[2].f(2) me devolverá 1.<br>
> var[0].f(2) me devolverá 0.<br>
><br>
> ¿De qué modo podría yo implementar a pA en C++? En caso de no ser posible,<br>
> ¿qué sería lo más cercano a pA? ¿Tendré que usar punteros a funciones para<br>
> crear nuevos objetos de clases generalizables por A, o hay otra estrategia?<br>
><br>
<br>
</div>Como he mencionado antes, esto es justamente la idea tras el<br>
polimorfismo, pero no tenemos que saber el tipo de dato para poder<br>
invocar la función miembro debida, sino que el mecanismo de<br>
polimorfismo ya toma en cuenta esto y elige correctamente la función<br>
que queremos. En tu menú, instancia el objeto polimórfico de la clase<br>
correcta según la elección del usuario y el comportamiento de tu<br>
programa. Por ejemplo,<br>
<br>
A *pObj;<br>
<br>
int opcion;<br>
cin >> opcion;<br>
<br>
switch( opcion )<br>
{<br>
  case 1:<br>
    pObj = new A;<br>
    ...<br>
  break;<br>
<br>
  case 2:<br>
    pObj = new B;<br>
    ...<br>
  break;<br>
<br>
  case 3:<br>
    pObj = new C;<br>
    ...<br>
  break;<br>
}<br>
<br>
Después de esto, ya puedes invocar las funciones miembro que quieres,<br>
y el sistema de polimorfismo elegirá la "versión correcta" de cada<br>
función miembro. Todo esto sucede sin necesidad de manipular<br>
directamente los tipos de datos; sólo invocamos las funciones que<br>
queremos, y el polimorfismo se encarga de elegir los detalles ya<br>
definidos.<br>
<br>
<br>
Espero que esto te ayude.<br>
<div class="HOEnZb"><div class="h5"><br>
Steven<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br></div>