正如其他人所指出的,您既不应该使用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.
}
}
请注意,在这两种情况下,您的 Animal 类型都应该是多态的。这意味着它必须具有或继承至少一个虚拟功能。