2010-05-03 10 views
2

Je souhaite passer du pointeur de classe supérieure à la classe inférieure, c'est-à-dire du pointeur de classe de base au pointeur de classe dérivé.Quelle technique de moulage est la meilleure pour faire du moulage de la classe supérieure vers la classe inférieure en C++?

Devrais-je utiliser "Dynamic_cast" ou "reinterpret_cast"? veuillez me conseiller

+0

Vous devez supprimer le tag "qt", car la question n'est pas particulièrement liée à Qt;) – ereOn

+0

Merci ereOn .. je pense que hjhill a édité et supprimé l'étiquette Qt :) merci hjhill – Naruto

+1

@Solitaire: pourquoi avez-vous besoin de downcast? C'est parfois nécessaire, mais c'est aussi une odeur (signe d'un design problématique). – outis

Répondre

11

N'utilisez pas reinterpret_cast - soit utilisez static_cast ou dynamic_cast. Si vous êtes sûr que le pointeur correspond exactement à cet objet de classe dérivé, utilisez static_cast, sinon utilisez dynamic_cast (cela nécessitera que la classe de base soit polymorphe) et vérifiez le résultat pour vous assurer que le pointeur correspond effectivement à la classe que vous voulez.

+0

vous voulez dire, pour la coulée ascendante ainsi que la coulée descendante, static_cast est mieux? ou quand dois-je utiliser static_cast ou dynamic_cast? – Naruto

+0

Vous n'avez pas besoin d'utiliser un cast pour le "casting ascendant". 'Dérivé * dptr = quelque chose; Base * bptr = dptr; 'fonctionne bien. –

+0

Ok, bien .. si je suis sûr que je vais faire cast supérieur, je ne vais pas utiliser de casting, pour le coulage vers le bas toujours je preffer static_cast .. mais à quoi sert Dynamic_cast? quand je dois utiliser "reinterprit_cast"? – Naruto

7

Cela dépend de ce que vous savez du pointeur.

Si vous savez pour sûr que le pointeur que vous avez est d'un type enfant, vous pouvez le static_cast<> en toute sécurité.

Si vous ne savez pas avec certitude, il suffit d'aller avec dynamic_cast<> mais cela a un coût et est plus lent.

0

Pour ajouter à la réponse d'Ereon: Et si vous ne connaissez pas le type, utilisez dynamic_cast pour effectuer une vérification du type d'exécution en interceptant l'exception bad_cast.

+0

S'il lance des pointeurs, il ne lancera pas de bad_cast. –

+0

Mais il obtiendra un pointeur nul s'il ne s'agit pas du type dynamic_cast. – foxwoods

2

reinterpret_cast <> est un dernier recours et doit être évité.

Dans Qt, si vous transtypez entre QObjects, utilisez qobject_cast <>. Il est sémantiquement comme dynamic_cast mais n'a pas de problèmes avec les limites dll etc.