Во-первых, вряд ли есть причина для динамического создания вектора с использованием 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.