2018年01月13日
《その233》 exceptionクラス
exceptionクラス
exceptionクラスは、すべての例外型の基底クラスです。以下はその定義例です。
class exception {
public:
exception () throw();
exception (const exception&) throw();
exception& operator= (const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
}
仮想メンバ関数 what の返却値と、その返却値の型である const char* について、次のプログラムで確認してみます。
確認した内容は、プログラム中に、コメントとして書き加えました。
// ------------------------------------
#include <iostream>
using namespace std;
int main() {
exception e;
// 以下の4つのクラスは、class exception からの public派生
// です。
bad_exception bad_e;
bad_alloc bad_a;
bad_cast bad_c;
bad_typeid bad_t;
exception* p[] = { &e, &bad_e, &bad_a, &bad_c, &bad_t };
// 基底クラス exception へのポインタ型で、各派生クラスを
// 一括して指していますが、多相的クラスは自身の動的
// な型を知っているので、自身の what 関数を使って、
// それぞれ独自の値を返却します。
for (int i = 0; i < 5; i++) {
cout << p[i]->what() << '\n';
}
cout << "\nwhat関数の返却値型は "
<< typeid(e.what()).name() << "\n\n";
// what関数の返却値は char const* 型です。string型ではあ
// りません。
// exceptionクラスの定義例として、次のように書かれている
// ことが多いのですが、これによると what関数
// の返却値は const char* 型となっています。
//
// class exception {
// public:
// exception() throw();
// exception(const exception&) throw();
// exception& operator= (const exception&) throw();
// virtual ~exception() throw();
// virtual const char* what() const throw();
// };
cout << typeid(const char*).name() << "\n\n";
// 「 char const* 」 と出力されます。
// 「 const char* 」 は 「 char const* 」 と同じということの
// ようです。
// 今回の話とは関係ありませんが、「 char* const 」 は
// 上の2つとは違います。
cout << typeid(char* const).name() << '\n';
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7194042
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック