[解決済み] なぜC++では純粋仮想デストラクタが必要なのでしょうか?
質問
仮想デストラクタの必要性は理解しています。しかし、なぜ 純粋 仮想デストラクタ?あるC++の記事で、著者はクラスを抽象化したいときにpure virtual destructorを使うと述べています。
しかし、メンバー関数のいずれかを pure virtual にすることで、クラスを抽象化することができます。
そこで質問なのですが
-
デストラクタを本当に純粋な仮想にするのはいつですか?誰かいい実例を教えてください。
-
抽象クラスを作成するとき、デストラクタも純粋仮想にすることは良い習慣ですか?もしそうなら、なぜですか?
解決方法は?
-
おそらく、純粋仮想デストラクタが許可されている本当の理由は、それを禁止すると言語に別のルールを追加することになり、純粋仮想デストラクタを許可しても何の悪影響もないため、このルールは必要ないためでしょう。
-
いや、普通のバーチャルで十分だ。
オブジェクトを作成し、その仮想メソッドにデフォルトの実装を施した上で、誰にもオーバーライドを強要せずに抽象化したい場合 特定 メソッドを使用すれば、デストラクタを純粋仮想化することができます。あまり意味があるとは思えませんが、可能性はあります。
コンパイラは派生クラスに対して暗黙のデストラクタを生成するので、クラスの作者がそうしない場合、すべての派生クラスがそうなることに注意してください。 ない 抽象的である。したがって、純粋仮想デストラクタを基底クラスに持っていても、派生クラスには何の影響もありません。基底クラスが抽象化されるだけです。 カッパ のコメント)。
また、すべての派生クラスが特定のクリーンアップコードを持つ必要があり、それを書くためのリマインダーとして純粋な仮想デストラクタを使用すると仮定することもできますが、これは作為的(および強制されない)なように思えます。
注意 デストラクタは、たとえそれが は 純粋仮想 があります。 は、派生クラスをインスタンス化するために実装を持つ必要があります(はい、純粋な仮想関数は実装を持つことができます)。
struct foo {
virtual void bar() = 0;
};
void foo::bar() { /* default implementation */ }
class foof : public foo {
void bar() { foo::bar(); } // have to explicitly call default implementation.
};
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] 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++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】'cout'は型名ではない
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Enterキーを押して続行する
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] C++における純粋仮想デストラクタ