頑張って、長続きしたい。

メモ書きをひたすら書く。継続は力なり。

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