2017年12月22日
《その195》 例外クラス bad_typeid
bad_typeidクラス
typeid演算子は、多相的クラス型へのポインタによる参照を受け取ると、その参照先の動的なオブジェクト型を表す type_infoオブジェクトを生成します。
そして、その type_infoオブジェクトへの参照が typeid演算子の演算結果です。
typeid演算子が、多相的クラス型へのポインタによる参照を受け取った際に、そのポインタが空ポインタであった場合には、例外 bad_typeid が送出されます。
bad_typeidクラスは、exceptionクラスの派生クラスで、<typeinfo>ヘッダで提供されます。
次のプログラムは、以上のことを確認するためのものです。
なお、多相的クラスオブジェクトの動的な型を調べる際には、各オブジェクトに埋め込まれた仮想関数テーブルへのポインタが利用されます。
// ------------------------------------
#include <exception>
#include <typeinfo>
#include <iostream>
using namespace std;
class Aaa {
public:
virtual void f() { }
// クラス Aaa を多相的クラスにするために、
// 仮想メンバ関数を設定。
};
int main() {
Aaa aaa;
// Aaa型のオブジェクト aaa を作成。
Aaa* ptr1 = &aaa;
// Aaa*型ポインター ptr1 は aaa を指す。
Aaa* ptr2 = NULL;
// Aaa*型ポインター ptr2 は NULL
try {
cout << typeid(*ptr1).name() << endl;
}
catch (bad_typeid e) {
cout << e.what() << endl;
}
try {
cout << typeid(*ptr2).name() << endl;
}
catch (bad_typeid e) {
cout << e.what() << endl;
// what は bad_typeidクラスのメンバ
// 関数であり、処理系定義の
// NTBS(C言語形式の文字列)
// を返却します。
}
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7119249
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック