ガイドライン#4リンクテキスト、状態:
基本クラスのデストラクタは、パブリックで仮想、または保護されて非仮想である必要があります。
何かが足りないかもしれませんが、基本クラスとして使用するように設計されていない具象クラスを作成した場合はどうなりますか。
デストラクタをパブリックおよび仮想であると宣言する必要がありますか?これにより、私のクラスは「基本クラスとして使用する準備ができている」と暗黙のうちに宣言しますが、これは必ずしも真実である必要はありません。
ガイドライン#4リンクテキスト、状態:
基本クラスのデストラクタは、パブリックで仮想、または保護されて非仮想である必要があります。
何かが足りないかもしれませんが、基本クラスとして使用するように設計されていない具象クラスを作成した場合はどうなりますか。
デストラクタをパブリックおよび仮想であると宣言する必要がありますか?これにより、私のクラスは「基本クラスとして使用する準備ができている」と暗黙のうちに宣言しますが、これは必ずしも真実である必要はありません。
リンクテキストには、「基本クラスのデストラクタは次のようになります」と具体的に記載されています。
ガイドラインは、基本クラスとして使用するように設計されたクラスのみを対象としています。基本クラスとして使用されない単一の具象クラスを作成する場合は、パブリックコンストラクターを非仮想のままにしておく必要があります。
あなたのクラスの他に仮想のものがなければ、デストラクタも仮想であるべきではないと思います。
クラスが後で拡張される場合にのみ、デストラクタは仮想である必要があります。保護された/プライベートのデストラクタが必要な場合はわかりません。
仮想メソッドが1つでもある場合、デストラクタを仮想化することで(ほとんどのコンパイラで)何も失われないことに注意してください(ただし、誰かが後で拡張した場合に備えて保護されます)。
別の方法で考えてみてください。クラスから絶対に派生しようとする人は誰もいないことを知っていますか。誰かがそうするとき、彼はあなたのdtorを詳しく調べることを忘れないだろうと思いますか。時々人々は正当な理由で構成よりも継承を使用します(醜いゲッター構文を持たずにクラスの完全なインターフェースを提供します)。
仮想dtorのもう1つのポイントは、オープン/クローズド原則です。
ハードリアルタイムパフォーマンスなどに関心がない場合は、仮想dtorを使用します。
デストラクタは、次のいずれかの場合に仮想である必要があります。
まれな例外:
パブリックまたはプロテクトに関して-一般的に、デストラクタへのアクセスをどのように制御するかという問題があります。
アドバイスは、多態的な基本クラスを意図した仮想関数を持つクラスに言及しています。誰かがdelete
基本クラスポインタを呼び出すと、実際のクラスのデストラクタが呼び出されることを確認する必要があります。そうしないと、派生クラスによって割り当てられたリソースが解放されません。
これを実現するには、次の2つの方法があります。
delete
、基本クラスポインタの呼び出しが防止されます。基本クラスとして使用されない具象クラスの場合delete
、実際の型へのポインターのみを呼び出すため、アドバイスは適用されません。必要に応じて、パブリック非仮想デストラクタが必要です。