Ma question est liée à RTTI en C++ où j'essaie de vérifier si un objet appartient à la hiérarchie de type d'un autre objet. La méthode BelongsTo() vérifie cela. J'ai essayé d'utiliser typeid, mais cela génère une erreur et je ne suis pas sûr de la façon dont je peux trouver le type de cible à convertir lors de l'exécution.Type coulée en C++ en détectant le type d'objet 'this' actuel
#include <iostream>
#include <typeinfo>
class X
{
public:
// Checks if the input type belongs to the type heirarchy of input object type
bool BelongsTo(X* p_a)
{
// I'm trying to check if the current (this) type belongs to the same type
// hierarchy as the input type
return dynamic_cast<typeid(*p_a)*>(this) != NULL; // error C2059: syntax error 'typeid'
}
};
class A : public X
{
};
class B : public A
{
};
class C : public A
{
};
int main()
{
X* a = new A();
X* b = new B();
X* c = new C();
bool test1 = b->BelongsTo(a); // should return true
bool test2 = b->BelongsTo(c); // should return false
bool test3 = c->BelongsTo(a); // should return true
}
Faire la méthode des classes virtuelles et de laisser faire dérivés, il semble être une mauvaise idée que j'ai beaucoup de classes dans la même hiérarchie de type. Ou est-ce que quelqu'un connaît un autre moyen de faire la même chose? Veuillez suggérer.
Mise à jour: b.BelongsTo (a) doit détecter si le type d'objet d'entrée (a) est un ancêtre de l'objet courant (b) dans la hiérarchie de types.
Bien que je ne suis pas sûr que cela peut b Bien fait, je ne sais pas non plus comment cela * pourrait être utile. Juste par curiosité, pourquoi voulez-vous y parvenir? – ereOn
S'il vous plaît voir les commentaires sur la réponse de Neil pour un exemple. – Elroy
Par exemple. C dérive de B dérive de A, X dérive de A. Dans certains cas, je dois vérifier que le type d'objet que je reçois pointé par le pointeur de classe de base (A *) doit être de type B et non de type X, à défaut que je vais jeter une erreur. – Elroy