C ++標準では、例外仕様を持つ仮想関数について次のように規定されています。
仮想関数に例外仕様がある場合、派生クラスのその仮想関数をオーバーライドする関数の定義を含むすべての宣言は、基本クラスの仮想関数(C +)の例外仕様によって許可される例外のみを許可するものとします。 +03§15.4/3)。
したがって、次の形式は正しくありません。
struct B {
virtual void f() throw() { } // allows no exceptions
};
struct D : B {
virtual void f() { } // allows all exceptions
};
(1)このルールはデストラクタに適用されますか?つまり、次は整形式ですか?
struct B {
virtual ~B() throw() { }
};
struct D : B {
virtual ~D() { }
};
(2)このルールは、暗黙的に宣言されたデストラクタにどのように適用されますか?つまり、次は整形式ですか?
struct B {
virtual ~B() throw() { }
};
struct D : B {
// ~D() implicitly declared
};
一般的なケースでは、例外仕様を記述してはなりませんstd::exception
が、デストラクタは仮想であり、空の例外仕様があるため、この質問には実際的な影響があります。
デストラクタから例外がスローされないようにすることをお勧めします。例を簡略化するために、デストラクタがすべての例外を許可する(つまり、例外指定がない)か、例外を許可しない(つまり、空の例外仕様があります)。