171

次のように書くのは間違っていますか?

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

抽象基本クラスの?

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

4

2 に答える 2

227

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

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

inline A::~A() { }

十分なはずです。

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

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

于 2009-03-10T16:04:00.057 に答える
49

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

12.4デストラクタ

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

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

10.4抽象クラス

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

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

ドラフトから直接取得:

struct C {
   virtual void f() = 0 { }; // ill-formed
};
于 2009-03-10T16:19:54.340 に答える