2017-05-12 25 views

答えて

4
struct Base { 
    virtual ~Base() {} 
}; 
struct Foo : Base { 
    ~Foo() override {} 
}; 

これはコンパイルされます。

struct Base { 
    ~Base() {} 
}; 
struct Foo : Base { 
    ~Foo() override {} 
}; 

これはありません。

struct Base { 
    ~Base() {} 
}; 
struct Foo : Base { 
    virtual ~Foo() {} 
}; 

これはコンパイルされます。

Live example

あなたの目標は、あなたがBasevirtualデストラクタを持っていることを期待しているFoo状態にある場合は、それを行うための最も簡単な方法は、~Foooverrideキーワードです。 Foo*からBase*までの削除のセマンティクスは、~Foovirtualであるかどうかによって大きく変化するため、これは一部の人には便利なことがあります。

この状況を参照するには、overrideという用語を使用して他のものを怒らせることがあります。

人がoverrideを用いてoffencedされるかどうかを確認以上である、またはBaseそうBaseへのポインタを介しFooのインスタンスを削除し、仮想デストラクタを有することFoo状態することができることよりも重要挙動を定義します。私はあなたのためにその決定をすることはできません。

@HowardHinnantがコメントに記載しているように、明示的なデストラクタを追加することには影響があります。そうする場合は、5の規則に従い、=default=deleteのいずれかを実行するか、コピー/移動オブジェクト構成/代入演算子を実装します。

static_assertBaseには、他の理由でデストラクタが必要な場合を除き、仮想デストラクタが追加されている方が簡単です。

+4

同意した(そして上書きした)。しかし、暗黙的に宣言されたデストラクタを使用することが最善であるかどうかも考慮してください。デストラクタを追加すると( 'override'かどうか)、暗黙的に宣言されたmoveメンバは暗黙的に無効になります。また、コピー・メンバーが暗黙的である場合、非推奨の動作に依存しています。ユーザーが宣言したデストラクタを追加する際には、これをすべて考慮する必要があります。 'override'をマークする目的のためにデストラクタ_only_を追加することは過度のことかもしれません。 '〜Foo()'が 'virtual'であることを保証する他の方法があります。例えば' static_assert(std :: has_virtual_destructor {}) 'です。 –

関連する問題