検討
class A
{
public:
virtual void foo () = 0;
};
この時点でA
、 が抽象クラスであり、単独でインスタンス化されることは決してないことは明らかです。では、自動生成されたデストラクタも仮想でなければならないことを標準が要求しないのはなぜでしょうか?
インターフェイス クラスでダミーの仮想デスクタクタを定義する必要があるたびに、この質問を自問します。
質問: 抽象クラスで生成されたデストラクタが仮想でないのはなぜですか?
検討
class A
{
public:
virtual void foo () = 0;
};
この時点でA
、 が抽象クラスであり、単独でインスタンス化されることは決してないことは明らかです。では、自動生成されたデストラクタも仮想でなければならないことを標準が要求しないのはなぜでしょうか?
インターフェイス クラスでダミーの仮想デスクタクタを定義する必要があるたびに、この質問を自問します。
質問: 抽象クラスで生成されたデストラクタが仮想でないのはなぜですか?
C++ では、必要のないものにお金を払う必要がなく、仮想デストラクタによって (すでにポリモーフィックなクラスであっても) 多くの場合必要のないオーバーヘッドが追加されるためです。たとえば、ポリモーフィックな破棄が必要なく、代わりに保護されたデストラクタを選択する場合があります。
さらに、別のシナリオとして、多態的な破棄を必要とする仮想メソッドを持つクラスがあるとします。virtual
ここで、もう一方のメソッドが不要になり削除されたが、ポリモーフィックな破棄がまだ必要であると想像してください。ここで、戻って仮想デストラクタを追加するか、未定義の動作に苦しむことを忘れないでください。
最後に、特に要求されない限り、常に一貫してデストラクタを非仮想にするのではなく、クラスがポリモーフィックであるかどうかに基づいて、デストラクタのデフォルトの仮想性を変更することを正当化するのは難しいと思います。
仮想デストラクタは、このクラスが破棄されるたびに逆参照を引き起こします。オーバーヘッドはかなり小さいですが、C++ はできるだけ多くの時間を節約したいと考えています。とにかく、暗黙のコンパイラーマジックを信頼するよりも、明示的であることは常に優れています。C++ のモットー: 「プログラマーを信頼する」。
LG 入口