通过检测当前的'this'对象类型,在C ++中键入cast

时间:2010-06-02 09:30:50

标签: c++ rtti

我的问题与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)的祖先。

2 个答案:

答案 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