2012-07-15 19 views
26

、我々は、オートようにデストラクタを宣言することができます生成:デフォルト純粋仮想デストラクタ

struct X { 
    virtual ~X() = default; 
}; 

また、私たちは純粋仮想するデストラクタを宣言することができます。

struct X { 
    virtual ~X() = 0; 
}; 

私の質問は:どのようにデストラクタをの両方を生成すると宣言する純粋な仮想?次の構文のように見えるが正しくありません:

struct X { 
    virtual ~X() = 0, default; 
}; 

も、この1:

struct X { 
    virtual ~X() = 0 default; 
}; 

EDIT:質問の目的上 いくつかの明確化

struct X { 
    virtual ~X() = 0 = default; 
}; 

どちらもこの一つです。基本的には空のクラスをインスタンス化不可能な基本クラスにしたいが、派生クラスはインスタンス化可能です。その場合、クラスには純粋な仮想デストラクタが必要です。しかし一方で、私は.cppファイルで定義を提供したくありません。だから私はdefaultに相当する何らかの仕組みが必要です。誰かが問題を解決するアイデアを持っているのだろうかと思います。

+2

あなたは '仮想〜X()= 0 {}'行うことができますか?今あなたがしようとしていることをもう一度考えてみましょう。 – Xeo

+4

@ Xeo:はいできます。しかし、その構文ではありません。非インライン実装を提供する必要があります。すべての純粋仮想関数はデフォルト実装を持つことができます。つまり、非抽象派生クラス*は関数を実装する必要がありますが、実装の一部として親のデフォルト実装を呼び出す必要があります。 – JohannesD

+1

@JohannesD:Michalの答えに対する私のコメントを参照してください。しかし、 '= default'は基本的に' {} 'クラス内です(メンバーがいない場合)。 – Xeo

答えて

39

純粋な仮想メソッドを定義するには、宣言とは別の定義が必要です。したがって

struct X { 
    virtual ~X() = 0; 
}; 

X::~X() = default; 
+0

正常にコンパイルされた[Ideaoneの例へのリンク](http://ideone.com/Y4iPA)です。 –

+0

ダーノ、私は効果的なC + +のコピーを取得している間に私にそれを打つ(これは古い構文を使用して表示されます) –

+3

この回答は間違っています!あなたはまだ 'X ::〜X()= default;という行を置く必要があります。 'を.cppファイルに挿入しなければ、' multiple definition'リンクエラーが発生します。 –

関連する問題