Si tuviera que crear una clase base llamada base
y las clases derivadas llamadas derived_1
, derived_2
etc ... utilizo una colección de instancias de la clase base, luego cuando recuperé un elemento y Intenté usarlo. Encontraría que C++ cree que su tipo es el de la clase base, probablemente porque lo recuperé de una base de std::vector
. Lo cual es un problema cuando quiero usar funciones que solo existen para la clase derivada específica, cuyo tipo sabía que era este objeto cuando lo puse en el vector.C++ clase base de fundición a la clase derivada lío
Así que lanzo el elemento al tipo que se supone que es y encontré que esto no funcionaría.
(derived_3)obj_to_be_fixed;
Y recordé que es una cosa de puntero. Después de algunos ajustes esto ahora funcionó.
*((derived_3*)&obj_to_be_fixed);
es esto correcto o hay por ejemplo una función abc_cast()
que lo hace con menos lío?
edición:
que tenía que ampliar esto en otra pregunta, las soluciones completas se muestra allí. stackoverflow.com ... why-the-polymorphic-types-error-and-cleanup-question
Espera, ¿eso es un 'std :: vector < base >' o un 'std :: vector < base * >'? Porque en el primer caso, si está almacenando objetos de la clase derivada, probablemente también haya algún corte de objeto ... –
Ouch. En general, no debes hacer eso porque, como ya se dijo, tendrás slicing de objetos (http://en.wikipedia.org/wiki/Object_slicing), que en realidad reduce todos tus objetos a instancias de la clase base; si desea almacenar objetos de varias clases derivadas de la misma jerarquía de clases, debe usar un 'std :: vector < base *>'; esto mantendrá los objetos intactos, aunque igual los obtendrá como indicadores de la clase base (vea la respuesta de @Peon the Great para ver cómo lidiar con ellos). –
Gracias por la información de corte de objetos, tales cosas no están claras en C++. Voy a cambiar mi mapa para mantener punteros en su lugar. – alan2here