web-dev-qa-db-ja.com

C ++の純粋な仮想デストラクタ

書くのは間違っていますか:

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

抽象基本クラスの場合?

少なくともMSVCでコンパイルします...実行時にクラッシュしますか?

154
Ivan Krechetov

はい。また、デストラクタを実装する必要があります。

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

inline A::~A() { }

十分なはずです。

そして、これは反対票を得たので、私は明確にする必要があります:Aから何かを得て、それを削除または破壊しようとすると、Aのデストラクタが最終的に呼び出されます。純粋で実装がないため、未定義の動作が発生します。人気のあるプラットフォームの1つでは、purecallハンドラーが呼び出されてクラッシュします。

編集: http://www.comeaucomputing.com/tryitout/ でコンパイルされた宣言をより準拠するように修正

202
MSN

プライベートデストラクタ:派生クラスのオブジェクトを作成するとエラーが発生しますが、そうでない場合はエラーになります。ただし、診断が表示される場合があります。

12.4デストラクタ

6デストラクタは、仮想(10.3)または純粋仮想(10.4)として宣言できます。そのクラスまたは派生クラスのオブジェクトがプログラムで作成された場合、デストラクタが定義されます。

純粋な仮想デストラクタを持つクラスは抽象クラスです。よく注意してください:

10.4抽象クラス

2純粋仮想関数は、qualified-id構文(5.1)を使用して、または(12.4)を使用して呼び出す場合にのみ定義する必要があります。

[Note:関数宣言は、純粋指定子と定義の両方を提供することはできません。

ドラフトから直接取得:

struct C {
   virtual void f() = 0 { }; // ill-formed
};
46
dirkgently