typeinfoの機能を使ってみよう。
typeinfoヘッダで使えるものを学びました。ただ学んだといっても触りを覚えただけです。
簡単に今回覚えたことを書くと、アップキャストなどした後でも、元の型をtyoeid()で取得できる。戻り値はtype_info型の参照です。名前を出力するにはtypeid(型または値).name()で取得できます。
例:(返値) 関数名(引数)
(type_info&) typeid (型もしくは値)
取得したtype_info&型を使用すると自分の型を取得できます。
(const char*) typeid(型または値).name()
※typeidで取得できる情報は実行時に渡されてきたオブジェクト本来の型に関する情報になります。この、実行時に得られる型情報のことを「実行時型情報(Run-Time Type Infomation: RTTI)」と言います。(引用:ロベールのC++)
例:
#include<iostream>
#include<typeinfo>
#include<fstream>using namespace std;
void ShowType(const ostream& ostr){
cout << typeid(ostr).name() << endl;
}int main(){
fstream fs;ShowType(cout);
ShowType(fs);//以下略
}
//結果:(VC++の場合)//class std::basic_ostream<char,struct std::char_traits<char> >
//class std::basic_fstream<char,struct std::char_traits<char> >
関数で引数として渡す際アップキャストしてますが、元の型が表示されています。
(引用:ロベールのC++)
また、typeidで受け取った情報を比較演算することで処理を分けることができるようになります。
#include <iostream>
#include <fstream>
#include <typeinfo>using namespace std;
int main(){
const type_info& tyInfoOstram = typeid(ostream);
const type_info& tyInfoOfstram = typeid(ofstream);
const type_info& tyInfoCOfstram = typeid(const ofstream);
const type_info& tyInfoCROfstram = typeid(const ofstream&);cout << boolalpha;
if( tyInfoOstram == tyInfoOfstram ){ cout << true << endl; }
else{ cout << false << endl;}//結果:false
if ( tyInfoOfstram == tyInfoCOfstram ){ cout << true << endl; }
else{ cout << false << endl;}//結果:trueif ( tyInfoOfstram == tyInfoCROfstram ){ cout << true << endl; }
else{ cout << false << endl;}//結果:true
//以下略
}
一応、tyInfoOstream != tyInfoOfstream で
tyInfoOfstream == tyInfoCOfstram == tyInfoCROfstram であることがわかります。
const や&参照型に関する情報は、==や!=などの比較演算では無視されるそうです。これは演算子オーバーロードで動作を定義されているようですね。
ポリモーフィズムはクラスのメソッドに様々な動作をしてもらうオブジェクト指向の概念で、C++においては「継承」とそのクラスに一つでも「仮想関数」があることが条件になります。仮想関数がない場合、静的結合になりメソッドは呼ばれたクラスのものになってしまします。仮想関数があると動的結合され、typeid等で区別できるようになります。条件などは注意して頭に入れておきたいですね。
継承と仮想関数についてはこのブログでは説明しないので、申し訳ありませんが各自確認お願いします。