ホームページ >バックエンド開発 >C++ >C の抽象基本クラスには純粋な仮想デストラクターが必要ですか?

C の抽象基本クラスには純粋な仮想デストラクターが必要ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-28 06:21:17807ブラウズ

Should Abstract Base Classes in C   Have Pure Virtual Destructors?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。