可以使用typeid来确定父子关系

时间:2009-11-19 01:31:51

标签: c++

我一直在使用dynamic_cast来确定对象的父子关系。

#include <iostream>

class A {
public:
    virtual ~A() {}
};

class B : public A {
};

class C : public A {
};

int main()
{
    B b;
    std::cout<< typeid(b).name()<< std::endl;       // class B

    A* a = dynamic_cast<A *>(&b);
    if (a) {
        std::cout<< "is child of A"<< std::endl;    // printed
    }

    C* c = dynamic_cast<C *>(&b);
    if (c) {
        std::cout<< "is child of C"<< std::endl;    // Not printed
    }
    getchar();
}

我是否可以通过typeid确定对象的父子关系?例如,通过使用typeid检查,我怎么知道B是A的孩子?

感谢。

3 个答案:

答案 0 :(得分:4)

我认为你不能仅使用typeinfo中的信息在当前的C ++中做到这一点。我知道boost::is_base_of(类型特征将成为C ++ 0x的一部分):

if ( boost::is_base_of<A, B>::value ) // true
{
    std::cout << "A is a base of B";
}

答案 1 :(得分:0)

typeid不透明。它并不意味着是一种反思。也就是说,对dynamic_cast的返回进行空检查可能与尝试遍历typeid结构以确定类关系一样快。坚持使用前C ++ 0x代码中的dynamic_cast。

答案 2 :(得分:-1)