首先,不太可能有理由使用 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。