<div>Gracias por su respuesta.</div><div><br></div>Sí, sé que el polimorfismo te permite muchas cosas.<div><br></div><div>Sé que puede realizarse lo siguiente con polimorfismo:</div><div>A *varB = new B();</div><div>A *varC = new C();</div>
<div><br></div><div>Pero mi duda es si puedo realizar algo similar a esto:</div><div>pA = B;</div><div>A *varB = new pA; // A *varB = new B();</div><div>pA = C;</div><div>A *varC = new pA // A *varC = new C();</div><div><br>
</div><div>Considerando que B y C heredan propiedades de A.</div><div><br></div><div>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.</div>
<div>Cada objeto que cree debe ser del tipo indicado por pA, y no está previamente definido cuántos podré crearlos.</div><div>En un menú de opciones daré a elegir qué clase querrá usar (si será la B o la C).</div><div><br>
</div><div>Daré otro ejemplo de lo que pretendo, con algo más concreto:</div><div><br></div><div>class A</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>virtual double f(double x);</div>
<div>};</div><div><br></div><div>class B: public A</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>double f(double x) {return 5;}</div><div>};</div><div><br></div><div>class C: public A</div>
<div>{</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>double n = 0;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>double f(doble x) {return n++;}</div><div>}</div><div><br>
</div><div>Si en el menú indico que usaré siempre la clase B, entonces pA deberá hacer referencia a B, de modo que:</div><div>A *var[4];</div><div>for (int i = 0; i < 4; i++)</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>var[i] = new pA();</div>
<div>Entonces, si yo ejecuto var[3].f(7), me devolverá 5. Ahora, si pA hacía referencia a C:</div><div>var[2].f(3) me devolverá 0.</div><div>var[1].f(5) me devolverá 0.</div><div>var[2].f(2) me devolverá 1.</div><div>var[0].f(2) me devolverá 0.</div>
<div><br></div><div>¿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?</div>
<div><br></div><div>Espero haber expresado correctamente mi duda.</div><div><br></div><div>Cordiales saludos.</div><div><br></div><div>Rafael Arias Michel</div><div><br><div class="gmail_quote">El 23 de octubre de 2012 13:53, 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">Hola Rafael,<br>
<br>
2012/10/23 Rafael Arias Michel <<a href="mailto:rgam496@gmail.com">rgam496@gmail.com</a>>:<br>
><br>
<br>
[CORTE]<br>
<div class="im"><br>
> Vemos que f es un puntero a función, que me da la libertad de elegir qué<br>
> algoritmo usaré para calcular los valores a graficar.<br>
><br>
> Del mismo modo, quería diseñar pA de tal modo que me permita elegir qué<br>
> clase usar, siempre que sea A una generalización de esa clase.<br>
><br>
<br>
</div>Lo que describes es justamente el polimorfismo, que te ha sugerido<br>
User. Debes crear una clase virtual que sirva de pariente para una<br>
jerarquía de clases. Para usar esta generalización de clases, creamos<br>
o bien punteros a objetos o bien referencias a ellos para comenzar el<br>
polimorfismo. Internamente, se aplica este cambio de puntero para que<br>
elija el conjunto de funciones del tipo correcto. Esto sería,<br>
<br>
class A {...};<br>
class B : public A {...};<br>
class C : public A {...};<br>
...<br>
A objA;<br>
B objB;<br>
C objC;<br>
<br>
A *ptr = &objA;<br>
ptr->graficar();<br>
<br>
ptr = &objB;<br>
ptr->graficar();<br>
<br>
ptr = &objC;<br>
ptr->graficar();<br>
<br>
Si no quieres usar polimorfismo, pero quieres hacer algo parecido,<br>
quizá más al estilo C, entonces podrías "jugar" con los tipos de<br>
punteros y realizar cástings. Por ejemplo,<br>
<br>
struct A {...};<br>
struct B { A obj; ...};<br>
struct C { A obj; ...};<br>
...<br>
A objA;<br>
B objB;<br>
C objC;<br>
<br>
A *ptr = &objA;<br>
ptr->graficar();<br>
<br>
ptr = (A *) &objB;<br>
((B *)ptr)->graficar();<br>
<br>
ptr = (A *) &objC;<br>
((C *)ptr)->graficar();<br>
<br>
Nuevamente, esto ya existe en C++ a través de la POO como la herencia<br>
y más sofisticadamente con el polimorfismo.<br>
<br>
<br>
Espero haber aclarado la duda.<br>
<span class="HOEnZb"><font color="#888888"><br>
Steven<br>
</font></span><div class="HOEnZb"><div class="h5"><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>