我有一个基类,它有两个派生自它的子类。
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)。难道不可能知道确切的类型吗?
谢谢!
答案 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)
。