ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

オブジェクトの型を取得

ある親クラスを継承した子クラスが複数種類あり、それらのオブジェクトを親クラスのポインタで保持している場合、元のオブジェクトの型を取得するときにはtypeid演算子を使えばよい。
typeid演算子はconst type_info&を返す。このtype_infoはクラスで定義されている。

#include <iostream>
using namespace std;

class Base
{
public:
    Base() {}
    virtual ~Base() {}
};

class ChildA : public Base
{
};

class ChildB : public Base
{
};

int main()
{
    Base* obj0 = new ChildA();
    Base* obj1 = new ChildA();
    Base* obj2 = new ChildB();

    const type_info& info0 = typeid(*obj0);
    const type_info& info1 = typeid(*obj1);
    const type_info& info2 = typeid(*obj2);

    if(info0 == info1) {
        cout << "info0 == info1" << endl;
    }
    if(info0 == info2) {
        cout << "info0 == info2" << endl;
    }
    
    return 0;
}

実行結果
info0 == info1

このように複数のオブジェクトがあり、すべて同じ親クラスのポインタで持っている。それらが同じクラスであるかを比較するのにtypeid演算子でtype_infoを取得し、それを比較して判定している。
以前、typeid演算子を使ってクラスの文字列を取得する方法について書いた。(id:toburau:20071108)
そして、今回、親クラスのポインタで持っているオブジェクトが同じクラスかどうか知りたい場合が出てきたので、上のようなコードで判定した。