デストラクタをoverride
にするのは良い方法ですか?なぜ、なぜそうではないのですか? 例:デストラクタをオーバーライドすることをお勧めしますか?
class Foo : Base
{
public:
~Foo() override {}
};
デストラクタをoverride
にするのは良い方法ですか?なぜ、なぜそうではないのですか? 例:デストラクタをオーバーライドすることをお勧めしますか?
class Foo : Base
{
public:
~Foo() override {}
};
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() {}
};
これはコンパイルされます。
あなたの目標は、あなたがBase
はvirtual
デストラクタを持っていることを期待しているFoo
状態にある場合は、それを行うための最も簡単な方法は、~Foo
上override
キーワードです。 Foo*
からBase*
までの削除のセマンティクスは、~Foo
がvirtual
であるかどうかによって大きく変化するため、これは一部の人には便利なことがあります。
この状況を参照するには、override
という用語を使用して他のものを怒らせることがあります。
人がoverride
を用いてoffencedされるかどうかを確認以上である、またはBase
そうBase
へのポインタを介しFoo
のインスタンスを削除し、仮想デストラクタを有することFoo
状態することができることよりも重要挙動を定義します。私はあなたのためにその決定をすることはできません。
@HowardHinnantがコメントに記載しているように、明示的なデストラクタを追加することには影響があります。そうする場合は、5の規則に従い、=default
、=delete
のいずれかを実行するか、コピー/移動オブジェクト構成/代入演算子を実装します。
static_assert
Base
には、他の理由でデストラクタが必要な場合を除き、仮想デストラクタが追加されている方が簡単です。
同意した(そして上書きした)。しかし、暗黙的に宣言されたデストラクタを使用することが最善であるかどうかも考慮してください。デストラクタを追加すると( 'override'かどうか)、暗黙的に宣言されたmoveメンバは暗黙的に無効になります。また、コピー・メンバーが暗黙的である場合、非推奨の動作に依存しています。ユーザーが宣言したデストラクタを追加する際には、これをすべて考慮する必要があります。 'override'をマークする目的のためにデストラクタ_only_を追加することは過度のことかもしれません。 '〜Foo()'が 'virtual'であることを保証する他の方法があります。例えば' static_assert(std :: has_virtual_destructor
私はそれが良い練習である場合、重複する質問に答えることはできませんが、実際にはそれについての未回答のコメントがあります。 –