C の純粋な仮想デストラクター
オブジェクト指向プログラミングの世界では、多くの場合、抽象基本クラスは純粋な仮想デストラクターを必要とします。ただし、次のようなコードを記述するときに懸念が生じます。
class A { public: virtual ~A() = 0; };
これにより、抽象基本クラスが純粋に仮想デストラクターを持つことが許容されるかどうかという問題が生じます。 Microsoft Visual C では問題なくコンパイルされますが、実行時には何が起こりますか?
答えは、「未定義の動作」です。 A から派生したクラスのインスタンスが削除または破棄されると、A のデストラクターが呼び出されます。ただし、これは純粋に仮想的なもので実装がないため、未定義の動作が引き起こされます。特定のプラットフォームでは、この結果、purecall ハンドラーが呼び出され、クラッシュが発生する可能性があります。
これを回避するには、デストラクターも実装することが重要です。次のような最小限の実装で十分です。
class A { public: virtual ~A() = 0; }; inline A::~A() { }
こうすることで、派生クラスのインスタンスが削除されたときに、A のデストラクターが未定義の動作を引き起こすことはありません。
以上がC の抽象基本クラスには純粋な仮想デストラクターが必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。