C で抽象基本クラスを定義するとき、次のように仮想デストラクターを純粋な仮想として宣言したくなるかもしれません。以下のコード スニペットに示されています:
class A { public: virtual ~A() = 0; };
この構文は特定の環境では有効ですMSVC などのコンパイラを使用すると、ランタイム クラッシュにつながる可能性のある潜在的な危険が生じます。
上記のコードの問題は、仮想デストラクターが次のように宣言されていることです。実装を提供せずに純粋であること。これは、デストラクターの動作が具体的な派生クラスに委任されることを意味します。ただし、タイプ A のオブジェクト自体が破棄されると、そのデストラクターが呼び出され、その実装が欠如しているため未定義の動作が発生します。
一般的なシナリオでは、抽象基本クラス A から派生クラスのオブジェクトを破棄しようとすると、最終的に A のデストラクターが呼び出されます。実装しないと、purecall ハンドラーの呼び出しやプログラムのクラッシュなど、特定のプラットフォームで未定義の動作が引き起こされる可能性があります。
この問題を解決するには、抽象ベースを使用します。クラスのデストラクターは、その本体が空であっても、明示的に実装する必要があります。以下の修正されたコード スニペットは、これを示しています。
class A { public: virtual ~A() = 0; }; inline A::~A() { }
A のデストラクターに空の実装を提供することで、直接または派生クラスを通じて呼び出されたときの動作が確実に定義されます。
以上がC で純粋な仮想デストラクターを実装する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。