[解決済み] 仮想デストラクタは継承されるのか?
2023-07-20 08:43:42
質問
仮想デストラクタを持つ基底クラスがある場合、派生クラスも仮想デストラクタを宣言する必要がありますか?派生クラスも仮想デストラクタを宣言しなければならないのでしょうか?
class base {
public:
virtual ~base () {}
};
class derived : base {
public:
virtual ~derived () {} // 1)
~derived () {} // 2)
};
具体的な質問
- 1)と2)は同じですか?2)はベースがあるので自動的に仮想化されるのか、それとも仮想化を"stop"するのでしょうか?
- 派生したデストラクタは、何もしなければ省略できるのでしょうか?
- 派生デストラクタを宣言するためのベストプラクティスは何ですか?virtual、non-virtual、可能なら省略のどれを宣言しますか?
どのように解決するのですか?
-
はい、同じです。 派生クラスが何かを virtual 宣言しなくても、それが virtual であることを止めることはできません。 実際、ベースクラスで仮想化されていたメソッド(デストラクタを含む)を派生クラスで仮想化しないようにする方法はありません。C++11では、次のように記述します。
final
を使用して、派生クラスでオーバーライドされるのを防ぐことができますが、それは仮想であることを防ぐものではありません。 - はい、派生クラスのデストラクタは、何もすることがなければ省略することができます。 そして、その仮想かどうかは問題ではありません。
-
私は可能なら省略します。 そして、私はいつもどちらかの
virtual
キーワードかoverride
を使用することで、派生クラスの仮想関数を明確にすることができます。 関数が仮想であることを理解するために、わざわざ継承階層を上がっていく必要はないはずです。さらに、クラスがコピーや移動が可能な場合、独自のコピーや移動のコンストラクタを宣言する必要はなく、何らかのデストラクタを宣言する(たとえdefault
として定義していても) デストラクタを宣言すると、コンパイラはコピーと移動のコンストラクタと代入演算子を入れてくれないので、必要であれば宣言しなければならなくなります。
項目 3 の小さなポイントとして。 デストラクタが未宣言の場合、コンパイラはデフォルトのものを生成することがコメントで指摘されています (それはまだ仮想です)。 そして、そのデフォルトのものはインライン関数です。
インライン関数は潜在的に、プログラムの他の部分の変更に対してより多くのプログラムを公開し、共有ライブラリのためのバイナリ互換性をトリッキーにします。 また、結合の増加により、ある種の変更に直面して多くの再コンパイルが必要になることがあります。 例えば、仮想デストラクタの実装が本当に必要だと判断した場合、それを呼び出すコードのすべての部分を再コンパイルする必要があります。 一方、クラスのボディで宣言した後、それを
.cpp
ファイルで空にしておけば、再コンパイルせずに変更しても問題ないでしょう。
私の個人的な選択は、可能な限り省略することです。 私の意見では、コードが乱雑になり、コンパイラーは空の実装よりもデフォルトの実装でわずかに効率的なことを行うことができます。 しかし、それが悪い選択となるような制約がある場合もあります。
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み] 仮想関数にデフォルトのパラメータを持たせることはできますか?
-
[解決済み] なぜC++では純粋仮想デストラクタが必要なのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】C++ 派生クラス内の関数に対する "virtual "キーワード。必要ですか?
-
[解決済み】「override」キーワードは、オーバーライドされた仮想メソッドをチェックするだけのものですか?