C.35:基底クラスのデストラクタがパブリックと仮想、または保護および非仮想のいずれかでなければなりません
デストラクタ基底クラスの仮想関数のいずれかのオープン、または、非仮想関数を保護されています
理由(理由)
未定義の動作を防ぐために。デストラクタが公開されている場合は、呼び出し元のコードは、基本クラスのポインタを通じて派生クラスのオブジェクトを破壊するために試みることができ、かつ基底クラスのデストラクタが非仮想である場合、結果は定義されません。デストラクタが保護されている場合は、コードを呼び出すと、基本クラスのポインタによって破壊することができないとデストラクタは仮想である必要はありません。それが派生デストラクタがそれを呼び出すことができるように、プライベートではありません、保護する必要がありません。一般的には、ベースクラスの作家は、破壊時に行われるための適切な措置を知りません。
未定義の動作を避けるために。デストラクタがパブリックである場合、呼び出しコードが場合基底クラスデストラクタが非仮想関数の結果が定義されていない場合に、オブジェクトを破壊するの派生クラスに側基本クラスのポインタを使用しようとします。派生オブジェクトベース型ポインタによって破壊することができない保護デストラクタ場合、呼び出し側のコードは、デストラクタが仮想でなければならない必要はありません。デストラクタは、派生クラスのデストラクタは、それを呼び出すことができますので、むしろ民間よりも、保護することです。一般的に、基本クラスの設計者は、アクションがデストラクタで行われるべきかを知りません。
ディスカッション(議論)
ディスカッションセクションでこれを参照してください:ディスカッションセクションを参照してください。
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-dtor。
例えば、悪い(陰性試料)
構造体ベース{// BAD:暗黙公共非仮想デストラクタ有する
仮想ボイドFを();
}。
構造体D:基本{
文字列s {「クリーンアップを必要とするリソース」}。
〜D(){/ * ...いくつかのクリーンアップを行う... * /}
// ...
};
ボイド使用()
{
unique_ptrを<ベース> P = make_unique <D>();
// ...
} // Pの破壊コール〜ベース()、D :: Sと、おそらく多くのリークが発生していない〜D()、
スワイプは、より多くのを見て左または右
Note(注意)
仮想関数は、派生クラスを見ることなく使用することができる派生クラスへのインタフェースを定義しています。インターフェースが破壊可能にした場合、そうするのが安全でなければなりません。
仮想関数派生クラス定義インターフェイスは、それが派生クラスを使用する場合に関係することができません。インターフェイスは、オブジェクトを許可する場合は、破壊のプロセスは安全でなければなりません。
Note(注意)
デストラクタは非プライベートでなければならないか、それはタイプを使用して防ぐことができます:
デストラクタは、それが他の人が使用することを望んでいないことを除いて、非プライベートでなければなりません。(これは、自身の破壊、翻訳者注クラスによって制御することができます)
クラスX {
〜X(); //プライベートデストラクタ
// ...
};
ボイド使用()
{
X A。//エラー:破壊することはできません
自動pを= make_unique <X>(); //エラー:破壊することはできません
}
例外(例外)
(とのみ、このようなA型の)派生型のオブジェクトは、ベースへのポインタを介して、他のオブジェクト(それ自体)を破壊するために許可する必要があります:私たちは、あなたが保護された仮想デストラクタを望む可能性があるケースを想像することができます。私たちはいますが、実際には、このようなケースを見ていません。
別のオブジェクト(それ自身ではない)の破壊に派生クラスのポインタでオブジェクト(のみ、このタイプ)基本クラスを許可することが望まれる場合:私たちは、仮想関数がプロテクトデストラクタ状況に必要であると想像することができます。しかし、我々は、実際の開発では、このような状況に遭遇していません。
施行(提案)
-
任意の仮想関数を持つクラスは、どちらかの公共および仮想または他の保護および非仮想ですデストラクタを持つ必要があります。
-
仮想関数仮想関数のクラスのいずれかのパブリック仮想関数を持っている、いずれかの非仮想関数を保護するために。
翻訳者注:仮想関数は、一般的には、クラスを派生したことを意味しています。
オリジナルリンク:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c35-a-base-class-destructor-should-be-either-public-and-virtual-or-protected-and-nonvirtual
私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。
より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]