- はい、同じです。派生クラスが仮想的なものを宣言していなくても、仮想化が妨げられることはありません。実際、メソッド(デストラクタを含む)が基本クラスで仮想である場合、派生クラスで仮想になるのを止める方法はありません。> = C ++ 11では
final
、派生クラスでオーバーライドされないようにするために使用できますが、仮想化を防ぐことはできません。
- はい、派生クラスのデストラクタは、関係がない場合は省略できます。そして、その仮想かどうかは関係ありません。
- できれば省略します。また、わかりやすくするために、派生クラスでは常に
virtual
キーワードまたは仮想関数のいずれかを使用しています。override
関数が仮想であることを理解するために、継承階層をずっと上に行く必要はありません。さらに、クラスが独自のコピーまたは移動コンストラクターを宣言せずにコピー可能または移動可能である場合、任意の種類のデストラクタを宣言すると(として定義した場合でもdefault
)、必要に応じてコピーおよび移動コンストラクターと割り当て演算子を宣言する必要があります。コンパイラーがそれらをあなたのためにもう入れないので、それら。
項目3の小さなポイントとして、コメントで、デストラクタが宣言されていない場合、コンパイラはデフォルトのデストラクタ(まだ仮想)を生成することが指摘されています。そして、そのデフォルトはインライン関数です。
インライン関数は、プログラムの他の部分の変更にプログラムの多くをさらす可能性があり、共有ライブラリのバイナリ互換性をトリッキーにします。また、結合の増加は、特定の種類の変更に直面して多くの再コンパイルをもたらす可能性があります。たとえば、仮想デストラクタの実装が本当に必要であると判断した場合は、それを呼び出したすべてのコードを再コンパイルする必要があります。一方、クラス本体で宣言してから.cpp
ファイルで空に定義した場合は、再コンパイルせずに変更しても問題ありません。
私の個人的な選択は、可能であればそれを省略することです。私の意見では、コードが乱雑になり、コンパイラーは、空の実装よりもデフォルトの実装を使用すると、わずかに効率的な処理を実行できる場合があります。しかし、あなたが下にあるかもしれない制約があり、それはそれを悪い選択にします。