我的问题与C ++中的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)的祖先。
答案 0 :(得分:2)
为了使RTTI正常工作class X
需要至少一个虚拟成员函数(虚拟析构函数也是如此)。如果没有虚拟成员函数,则类将不会有编译器生成的vtable,因此当您调用typeid
时,后者将无法按预期工作。
答案 1 :(得分:2)
这没有意义 - 您可以调用该函数的事实意味着该参数属于X层次结构,因为这是参数的类型。动态强制转换旨在找出已知层次结构中的实际类型。
代码中的语法错误:
return dynamic_cast<typeid(*p_a)*>(this) != NULL;
是因为typeid不是一个类型 - 你根本不能将它用作类似dynamic_cast的类型。
如果Naveen建议您想要查明实例是否属于子层次结构,请使用:
if ( dynamic_cast <A*>( some_x_ptr ) ) {
// yes, belongs to A sub-hierarchy
}
修改:您有:
A <- P <- X
A <- Q <- Y
,然后强>
A * a = new X;
dynamic_cast <P *>( a ); // not null
dynamic_cast <Q *>( a ); // null