仮想デストラクタの目的(つまり、デストラクタを仮想にする目的)は、 delete-expressionを介してオブジェクトのポリモーフィックな削除を容易にすることです。デザインでオブジェクトのポリモーフィックな削除が必要ない場合は、仮想デストラクタは必要ありません。あなたの例を参照すると、型B
のポインタを介して型のオブジェクトを削除するA *
必要がある場合(ポリモーフィック削除)、階層の上位にある仮想デストラクタが必要になりますA
。正式な観点からは、このように見えます。
(ところで、ニールが言ったように、重要なのはクラスオブジェクトの作成/削除方法であり、クラスが内部メモリを管理する方法ではないことに注意してください。)
優れたプログラミング手法については...それは最終的にはあなたの意図とデザインに依存します。クラスがポリモーフィックになるように設計されていない場合(仮想メソッドがまったくない場合)、仮想デストラクタは必要ありません。クラスがポリモーフィック(少なくとも1つの仮想メソッドを持つ)の場合、「万が一に備えて」デストラクタを仮想化することは非常に良い考えであり、この場合、パフォーマンス/メモリのペナルティは実質的にゼロになります。
後者は通常、かなりよく知られているグッドプラクティスガイドラインとして表されます。クラスに少なくとも1つの仮想メソッドがある場合は、デストラクタも仮想にします。正式な観点からは、仮想デストラクタは実際には必要ないかもしれませんが、それでも従うべきかなり良いガイドラインです。
リソースがないが多態的な階層を形成できるクラスは、階層の最下部に明示的な空の(さらには純粋な)仮想デストラクタを定義するだけで十分であることを除いて、常に空の仮想デストラクタを定義する必要があります。他のすべてのデストラクタは、コンパイラによって暗黙的に定義されている場合でも、自動的に仮想化されます。つまり、すべてのクラスで空のデストラクタを明示的に定義する必要はありません。ベースだけで十分です。