他の人が指摘したように、ポインタが指すものの動的な型を取得するために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.
}
}
どちらの場合も、アニマル タイプはポリモーフである必要があることに注意してください。つまり、少なくとも 1 つの仮想機能を持っているか継承している必要があります。