我一直在使用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的孩子?
感谢。
答案 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)
你可以谷歌像c ++ typeid示例,并得到这样的东西: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/the_typeid_operator.htm
:)