問題タブ [virtual-destructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++で抽象クラスの仮想デストラクタを宣言する必要があるのはなぜですか?
C ++で基本クラスの仮想デストラクタを宣言することは良い習慣ですが、virtual
インターフェイスとして機能する抽象クラスであっても、デストラクタを宣言することは常に重要ですか?いくつかの理由とその例を教えてください。
c++ - 仮想デストラクタを使用してはいけない場合は?
クラスの仮想デストラクタを宣言しない正当な理由はありますか? 具体的に書くのを避けるべき場合はいつですか?
c++ - すべてのクラスに仮想デストラクタが必要ですか?
final
Java と C# は、 andsealed
キーワードを使用して基本クラスとして使用できないクラスの概念をサポートしています 。しかし、C++ では、クラスの作成者にジレンマを残すクラスの派生を防ぐ良い方法はありません。すべてのクラスに仮想デストラクタがあるべきかどうか?
編集: C++11 以降、これは当てはまらないため、クラスが であることを指定できますfinal
。
一方では、オブジェクトに仮想デストラクタを与えることはvtable
、vptr
.
一方、後で誰かがこのクラスから派生し、基本クラスへのポインターを介して派生クラスを削除した場合、プログラムは (仮想デストラクタがないため) 不適切に定義され、率直に言って、オブジェクトごとのポインターを最適化することはばかげている。
仮想デストラクタを持つ握り手で(おそらく)、この型が多態的に使用されることを意図していることをアドバタイズします。
仮想デストラクタを使用しない明確な理由が必要だと考える人もいれば (この質問のサブテキストのように)、クラスが派生すると信じる理由がある場合にのみ仮想デストラクタを使用する必要があると言う人もいます。考える?
c++ - 仮想デストラクタをいつ使用するか?
私はほとんどのOOP
理論をしっかりと理解していますが、私を非常に混乱させているのは仮想デストラクタです。
デストラクタは、何があっても、チェーン内のすべてのオブジェクトに対して常に呼び出されると思いました。
いつそれらを仮想化するつもりですか、またその理由は何ですか?
c++ - C++ の仮想デフォルト デストラクタ
基本クラス (基準) から継承する継承クラス (基準) の大規模なセットがあります。criterion
さんのコードはこちら
このクラスから派生したクラスの例:
ここにはデストラクタがまったくありませんが、これは基本クラスであるはずなので、空の仮想デストラクタを挿入する必要がありますか?:
その仮想デストラクタ宣言が必要な場合、すべての中間クラスにも必要ですか? つまり、上記の fastFilter には仮想デストラクタも必要ですか?
c++ - 純粋仮想デストラクタについての質問
純粋仮想デストラクタを持つ抽象クラスを定義する場合、抽象クラスでデストラクタの定義を与える必要があるのはなぜですか?
c++ - COM のようなインターフェイスは、非仮想デストラクタについて警告します
コンパイルしている抽象クラスが仮想デストラクタを必要としないことを gcc に伝える方法はありますか (COM オブジェクトには決してありません)。たとえば、nsISupports は常に仮想デストラクタの欠落について文句を言います。この警告が必要な場合、COM に似ていないクラスがある可能性があるため、警告をオフにしても役に立ちません。
そのため __attribute__((com_interface)) は廃止され、vtable レイアウトのみが変更されました。このクラスに欠落しているデストラクタについて警告されたくないことをコンパイラに伝えることができる別の __attribute__ はありますか?
c++ - コンストラクター後およびデストラクター前の仮想メソッド呼び出しを自動的に実装する方法はありますか?
コンストラクターとデストラクタ内から仮想メソッドを呼び出す際のよく知られた問題により、コンストラクターの直後に呼び出される最終セットアップ メソッドと、それらの直前に呼び出される事前ティアダウン メソッドが必要なクラスになることがよくあります。デストラクタ、次のように:
これは機能しますが、呼び出し元が適切なタイミングでこれらのメソッドのいずれかまたは両方を呼び出すのを忘れるというリスクが伴います。
問題は、C++ でこれらのメソッドを自動的に呼び出す方法はありますか? (ないと思いますが、何か賢い方法があれば聞いてみようと思いました)
c++ - 具体的なクラスのデストラクタ
ガイドライン#4リンクテキスト、状態:
基本クラスのデストラクタは、パブリックで仮想、または保護されて非仮想である必要があります。
何かが足りないかもしれませんが、基本クラスとして使用するように設計されていない具象クラスを作成した場合はどうなりますか。
デストラクタをパブリックおよび仮想であると宣言する必要がありますか?これにより、私のクラスは「基本クラスとして使用する準備ができている」と暗黙のうちに宣言しますが、これは必ずしも真実である必要はありません。