Мой вопрос связан с RTTI в С++, где я пытаюсь проверить, принадлежит ли объект иерархии типов другого объекта. Метод BelongsTo() проверяет это. Я пытался использовать typeid, но он выдает ошибку, и я не знаю, как найти целевой тип для преобразования во время выполнения.
#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
}
Делать метод виртуальным и позволять производным классам делать это кажется плохой идеей, поскольку у меня много классов в иерархии одного и того же типа. Или кто-нибудь знает какой-либо другой/лучший способ сделать то же самое? Пожалуйста, предложите.
Обновление: b.BelongsTo(a) должен определять, является ли тип входного объекта (a) предком текущего объекта (b) в иерархии типов.