1. ホーム
  2. c++

[解決済み] C++における純粋仮想デストラクタ

2022-04-23 06:04:34

質問

と書いてはいけないのでしょうか?

class A {
public:
    virtual ~A() = 0;
};

抽象的な基底クラスのために?

少なくともMSVCではそれでコンパイルできるのですが......。実行時にクラッシュしませんか?

解決方法は?

デストラクタの実装も必要です。

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

で十分です。

そして、これは下馬評を得たので、はっきりさせておくと、Aから何かを派生させて、それを削除したり破壊しようとした場合。 A のデストラクタは最終的に呼び出されます。これは純粋なものであり、実装を持たないので、未定義の動作が発生します。ある人気のあるプラットフォームでは、purecallハンドラが呼び出され、クラッシュします。

編集:宣言をより適合するように修正し、コンパイル時に http://www.comeaucomputing.com/tryitout/