如何使用RTTI从父对象的集合(向量)获取对象类型

时间:2010-02-09 17:39:16

标签: c++ vector rtti

我有一个基类,它有两个派生自它的子类。

class A {};
class B : public A {};
class C : public A {};

我有另一个类,它有一个指向使用向量的A类成员集合的指针,如下所示:

vector<A*> *m_collection;

我所做的就是创建B类或C类的对象,并使用push_back将它们添加到集合中:

B *myb = new B();
m_collection->push_back(myb);

然后我遍历集合并尝试使用'typeid'进行检查,但它总是返回基类(A)。难道不可能知道确切的类型吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

首先,没有理由使用new动态创建矢量。简单地说:

vector<A*> m_collection;

然后你需要给你的基类一个或两个虚函数。虚拟析构函数将是一个良好的开端:

class A {
   public:
     virtual ~A() {}
};
如果没有它,你就无法安全地编写如下代码:

m_collection.push_back( new B );
delete m_collection[0];

执行此操作还将启用运行时类型信息。不过,启用typeid并不是C ++喜欢你使用RTTI的方式 - 你应该使用dynamic_cast

m_collection.push_back( new B );    // or new A or new C
if ( C * c = dynamic_cast<C *>( m_collection[0] ) ) {
   c->CFunc():  // function in C
}
else if ( B * b = dynamic_cast<B *>( m_collection[0] ) ) {
   b->BFunc():  // function in B
}
else if ( A * a = dynamic_cast<A *>( m_collection[0] ) ) {
   a->AFunc():  // function in A
}
else {
  throw "unknown type";
}

但一般情况下,最好使用虚函数机制进行调度,而不是使用RTTI。

答案 1 :(得分:0)

W.r.t。 typeid,你需要在你的基类(A)中有一个虚函数(vtable通常位于std :: type_info结构附近),然后你必须取消引用该对象,即typeid(*b)

相关问题