typeidの罠
クラスの型を調べるtypeid演算子というのがある。
でも、実際に使ってみると正しい結果を出してくれなかった。
結果として、継承元のクラスに仮想関数がなかったらダメということ。
ダメな例
#include <iostream> #include <typeinfo> class A{ }; class B : public A { }; int main(int argc, char **argv) { A *aa = new A(); A *ab = new B(); B *bb = new B(); std::cout << typeid(A).name() << std::endl; std::cout << typeid(B).name() << std::endl; std::cout << typeid(*aa).name() << std::endl; std::cout << typeid(*ab).name() << std::endl; std::cout << typeid(*bb).name() << std::endl; return 0; }
1A 1B 1A 1A // ここはBになって欲しい 1B
クラスAに仮想関数を持たせると
#include <iostream> #include <typeinfo> class A{ virtual void hoge() {}↲ }; class B : public A { }; int main(int argc, char **argv) { A *aa = new A(); A *ab = new B(); B *bb = new B(); std::cout << typeid(A).name() << std::endl; std::cout << typeid(B).name() << std::endl; std::cout << typeid(*aa).name() << std::endl; std::cout << typeid(*ab).name() << std::endl; std::cout << typeid(*bb).name() << std::endl; return 0; }
1A 1B 1A 1B // Bになった! 1B