読者です 読者をやめる 読者になる 読者になる

typeid

typeid演算子は実行時の型情報を取得する演算子・・・。
型情報はtype_info型で返ってくる・・・。

type_info - cpprefjp C++日本語リファレンス

class_baseオブジェクトのアドレスを、派生クラスのポインタclass_derived1、class_derived2に入れたら型情報はどうなるかをみる・・・。

class_baseのbase.hは、

virtualでprint_messageだけ持つクラス・・・。

base.cppは、

print_messageで"class_base"と出力・・・。

class_derived1のderived1.hは、

class_baseをpublic継承・・・。print_messageをオーバーライドしている・・・。

derived1.cppは、

"class_derived1"と出力・・・。

class_derived2も同様に、

class_baseの継承で、

オーバーライドして"class_derived2"と出力・・・。

main.cppは、

型情報を得るには、typeinfoのインクルードが必要・・・。
class_baseのポインタ3つ、class_derived1のポインタを1つ、class_derived2のポインタを1つ用意・・・。

base_ptr1にはclass_base、base_ptr2にはclass_derived1、base_ptr3にはclass_derived2のアドレスを格納しておく・・・。
derived1_ptrはclass_derived1、derived2_ptrはclass_derived2という感じで、型にそったオブジェクトアドレスを・・・。

typeid演算子でtype_infoを取得し、そのままnameメソッドで型名を出力・・・。
(いったんtype_info変数に入れるとかできない模様・・・。typeid(*ポインタ).name()という感じで一気に・・・。)

確認のために、print_messageでどのインスタンスかを出力・・・。

終ったらメモリ解放・・・。

実行してみると、

$ vi main.cpp
$ g++ -o main main.cpp base.cpp derived1.cpp derived2.cpp
$ ./main
10class_base
14class_derived1
14class_derived2
14class_derived1
14class_derived2

class_base
class_derived1
class_derived2
class_derived1
class_derived2
$

base_ptr1, base_ptr2, base_ptr3に入っていても、インスタンスは違うのを判別できてる・・・。
ただし、やり方によってはこうならない場合もあるので注意・・・。
(それについてはいずれ・・・。)

先頭の数字はなんだろ・・・。文字数?

C++ のtype_info.name() - hidemonの日記

g++の仕様?

Sample/cpp/typeid/typeid/src/typeid at master · bg1bgst333/Sample · GitHub