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