Как уже отмечали другие, вы не должны использовать оператор typeid
или dynamic_cast
для получения динамического типа того, на что указывает ваш указатель. виртуальные функции были созданы, чтобы избежать этого вида злобности.
В любом случае, вот что вы делаете, если вы действительно хотите это сделать (обратите внимание, что разыменование итератора даст вам Animal*
. Поэтому, если вы сделаете **it
, вы получите Animal&
) :
for(std::vector<Animal*>::iterator it = v.begin(); it != v.end(); ++it) {
if(typeid(**it) == typeid(Dog)) {
// it's a dog
} else if(typeid(**it) == typeid(Cat)) {
// it's a cat
}
}
Обратите внимание, что вы можете применять оператор typeid
и к самим типам, как показано выше. Вам не нужно создавать объект для этого. Также обратите внимание, что путь typeid не работает, если вы передаете ему указатель типа typeid(*it)
. Такое использование даст вам typeid(Animal*)
, что бесполезно.
Похоже, dynamic_cast
можно использовать:
for(std::vector<Animal*>::iterator it = v.begin(); it != v.end(); ++it) {
if(Dog * dog = dynamic_cast<Dog*>(*it)) {
// it's a dog (or inherited from it). use the pointer
} else if(Cat * cat = dynamic_cast<Cat*>(*it)) {
// it's a cat (or inherited from it). use the pointer.
}
}
Обратите внимание, что в обоих случаях ваш тип животных должен быть полиморфным. Это означает, что он должен иметь или унаследовать хотя бы одну виртуальную функцию.