dynamic_cast devrait faire l'affaire
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
Le dynamic_cast
mot clé convertit une donnée d'un pointeur ou d'un type de référence vers un autre, en effectuant une vérification à l'exécution pour garantir la validité de la conversion.
Si vous essayez de convertir en pointeur vers un type qui n'est pas un type d'objet réel, le résultat de la conversion sera NULL. Si vous essayez de convertir en référence à un type qui n'est pas un type d'objet réel, le cast lèvera une bad_cast
exception.
Assurez-vous qu'il existe au moins une fonction virtuelle dans la classe de base pour que dynamic_cast fonctionne.
Rubrique Wikipédia Informations sur le type d'exécution
RTTI n'est disponible que pour les classes polymorphes, ce qui signifie qu'elles ont au moins une méthode virtuelle. En pratique, ce n'est pas une limitation car les classes de base doivent avoir un destructeur virtuel pour permettre aux objets des classes dérivées d'effectuer un nettoyage approprié s'ils sont supprimés d'un pointeur de base.
dynamic_cast
jette pas si ce n'est pas convertible? Y a-t-il un moyen de le faire sans générer de lancer?A* aptr = dynamic_cast<A*>(ptr);
// n'est pas censé être comme çauint8_t*
? Autrement dit, puis-je vérifier celauint32_t* x = dynamic_cast<uint32_t*>(p)
, oùp
est-iluint8_t*
? (J'essaie de trouver un test pour punir les violations).La distribution dynamique est la meilleure pour votre description du problème, mais je veux juste ajouter que vous pouvez trouver le type de classe avec:
la source
11MyClass
. Pour démêler, vous pouvez utiliser la bibliothèque d'extension ABI danscxxabi.h
. Cela vous donneabi::__cxa_demangle
qui vous donnera le vrai nomCela s'appelle RTTI , mais vous voulez presque sûrement reconsidérer votre conception ici, car trouver le type et faire des choses spéciales en fonction de celui-ci rend votre code plus fragile.
la source
Juste pour être complet, je vais construire une version de Robocide et souligner qu'il
typeid
peut être utilisé seul sans utiliser name ():Production:
la source
Incorporez probablement dans vos objets une "balise" d'identification et utilisez-la pour faire la distinction entre les objets de classe A et les objets de classe B.
Cela montre cependant un défaut dans la conception. Idéalement, les méthodes de B que A n'a pas, devraient faire partie de A mais laissées vides, et B les écrase. Cela supprime le code spécifique à la classe et s'inscrit davantage dans l'esprit de la POO.
la source
Tu recherches
dynamic_cast<B*>(pointer)
la source
Parce que votre classe n'est pas polymorphe. Essayer:
Maintenant
BaseClas
est polymorphe. J'ai changé de classe en struct parce que les membres d'une structure sont publics par défaut.la source
Votre description est un peu déroutante.
De manière générale, bien que certaines implémentations C ++ aient des mécanismes pour cela, vous n'êtes pas censé poser des questions sur le type. Au lieu de cela, vous êtes censé faire un dynamic_cast sur le pointeur vers A. Ce que cela fera, c'est qu'au moment de l'exécution, le contenu réel du pointeur vers A sera vérifié. Si vous avez un B, vous obtiendrez votre pointeur vers B. Sinon, vous obtiendrez une exception ou null.
la source
Comme d'autres l'ont indiqué, vous pouvez utiliser dynamic_cast. Mais généralement utiliser dynamic_cast pour découvrir le type de la classe dérivée sur laquelle vous travaillez indique une mauvaise conception. Si vous surchargez une fonction qui prend le pointeur de A comme paramètre, elle devrait pouvoir fonctionner avec les méthodes / données de la classe A elle-même et ne devrait pas dépendre des données de la classe B.Dans votre cas, au lieu de remplacer si vous êtes sûr que la méthode que vous écrivez fonctionnera uniquement avec la classe B, alors vous devez écrire une nouvelle méthode dans la classe B.
la source
Utilisez des fonctions surchargées. Ne nécessite pas de dynamic_cast ni même de support RTTI:
la source
Si vous pouvez accéder à la bibliothèque boost, peut-être que la fonction type_id_with_cvr () est ce dont vous avez besoin, qui peut fournir un type de données sans supprimer les modificateurs const, volatile et && . Voici un exemple simple en C ++ 11:
J'espère que c'est utile.
la source