c++ casting de la classe de base de la classe dérivée de mess

Si je devais créer une classe de base appelée base et les classes dérivées appelé derived_1, derived_2 etc... j'utilise une collection d'instances de la classe de base, puis quand j'ai récupéré un élément et a essayé de l'utiliser, je trouve que le C++ pense que c'est le type est celui de la classe de base, probablement parce que j'ai récupérée à partir d'un std::vector de base. Qui est un problème quand je veux utiliser des fonctionnalités qui n'existent que pour la classe dérivée qui est du type que je savais que cet objet a été quand je l'ai mis dans le vecteur.

Donc je jette l'élément dans le type dont il est censé être et trouvé ceci ne fonctionnerait pas.

(derived_3)obj_to_be_fixed;

Et de rappeler que c'est un pointeur chose. Après quelques ajustements cela fonctionne aujourd'hui.

*((derived_3*)&obj_to_be_fixed);

Est-ce vrai ou est-il par exemple un abc_cast() fonction qui le fait avec moins de désordre?

edit:

J'ai dû l'étendre vers une autre question, le plein de solutions sont indiqués. stackoverflow.com ... pourquoi-le-polymorphe-types de l'erreur-et-nettoyage-question

Attendez, est-ce un std::vector< base > ou un std::vector< base * >? Parce que dans le premier cas, si vous êtes de stocker des objets de la classe dérivée, il ya probablement aussi un objet de découpage se passe...
Ouch. En général, vous ne devriez pas faire cela parce que, comme déjà dit, vous aurez objet de découpage (en.wikipedia.org/wiki/Object_slicing), qui permet en fait de réduire tous vos objets instances de la classe de base; si vous voulez stocker des objets de différentes classes dérivées de la même hiérarchie de classe, vous devez utiliser un std::vector< base *>; cela permet de garder les objets intacts, bien que vous aurez toujours comme des pointeurs vers la classe de base (voir @Peon la Grande la réponse de voir la façon de traiter avec eux).
Merci pour l'objet de découpage info, de telles choses pas claires en C++. Je vais changer ma carte pour contenir des pointeurs de la place.
(derived_3&)obj_to_be_fixed peuvent apparaître à travailler, mais il n'a pas!
Eu Oli. Merci. Je vais utiliser les std::vector<*> solution maintenant.

OriginalL'auteur alan2here | 2011-01-08