問題タブ [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.

0 投票する
2 に答える
146 参照

c++ - デストラクタの何が問題なのか理解できませんか?

面積と周長を持つ基本クラスであるポリゴンというクラスがあり、そこから長方形クラスを派生させる必要があります。現在、以下のプログラムは機能せず、次のエラーが表示されます。


プログラムに追加したデストラクタが原因ですが、両方を削除すると機能します。いくつかの調査を行ったところ、プログラムの .cpp ファイルを正しくコンパイルしていないことが原因である可能性があることがわかりました。それは私の問題ですか?そうでない場合、私の問題は何ですか?

0 投票する
2 に答える
375 参照

c++ - サードパーティ製ソフトウェアで仮想デストラクタを使用せずにクラスを派生させる

使用するヘッダーを含むサードパーティのライブラリが提供されます。現在、このライブラリにはクラス「Base」があります。このクラスの問題は、仮想デストラクタがないことです。サードパーティのコードを持っていないので、そこで変更を行うことはできません。

これを使用していくつかの派生クラスを作成し、オブジェクトが削除されたときにオブジェクトが適切にクリーンアップされるようにするように言われました。どうすればこれを達成できますか?


返信ありがとうございます。選択肢が 2 つしかないようです。

1) 派生クラスに仮想デストラクタを配置する 2) コンポジションを使用する。

私はアプローチ番号1を取ることを計画しています。仮想デストラクタを持つラッパー派生クラスを持つことを計画しています。そして、このラッパー派生クラスを使用して、さらに派生させます。以下はコードです。

このアプローチで問題ないかどうか教えてください。

0 投票する
2 に答える
2612 参照

c++ - アクセス違反 - 基本クラスのデストラクタが 2 回呼び出されるのはなぜですか?

パターンPlayerを実装しようとするクラスがあります。と呼ばれる基本クラスのメンバーが含まれています。クライアントからのデストラクタを呼び出すと、いくつかの問題が発生し、メモリ アクセス違反が発生します。開始日:DecoratorPlayerCharacterm_playerPlayermain

次の呼び出しシーケンスを持つ でdeleteオペレーターを呼び出した直後にエラーが発生します。mainCharacter

次に、のデストラクタCharacter:

ただし、奇妙なことは、このデストラクタが 2 回呼び出されているように見えることです。上記の実行が完了すると、デバッガを実行すると逆アセンブリに移動し、「スカラー削除デストラクタ」を介して、Characterデストラクタを再度呼び出すように見えます。Playerと呼ばれるのインターフェースCharacterDecorator:

ここに画像の説明を入力

クラッシュ時のコール スタック:

ここに画像の説明を入力

のデストラクタを呼び出すCharacterDecoratorと、次のようにCharacterのデストラクタが呼び出されます。

この時点で、私は完全に混乱していますCharacterDecorator。デストラクタが具体的な実装を通じて呼び出されることに加えて、抽象インターフェイスを通じてデストラクタが再度呼び出される理由がわかりません。さらに、デストラクタを追加してCharacterDecoratorも問題は解決しないようです。

参考までに、 の実装と のインターフェースを含めPlayerましCharacterCharacterDecorator

Player:

Character:

0 投票する
3 に答える
2180 参照

c++ - 仮想デストラクタがある場合、基本クラスポインタの「これを削除」すると派生クラスオブジェクトが削除されますか?

次のように、3レベルの深さのクラス階層があります。

さて、私が疑問に思っているのはfoo()、のオブジェクトを呼び出すとどうなるかということですC。オブジェクト全体を削除するのでしょうか、それともオブジェクトの一部だけを削除して、その部分をメモリに残しておくのBでしょうか。AC

0 投票する
3 に答える
130 参照

c++ - デストラクタが仮想ではない基本クラスから正しく継承するにはどうすればよいですか?

クラスAから継承したいのですが、Aのデストラクタは仮想ではなく、Aの定義を変更できません。次のケースを回避するにはどうすればよいですか?

0 投票する
2 に答える
1391 参照

c++ - 派生デストラクタとベース デストラクタの両方を呼び出す仮想デストラクタ

仮想機能を理解できません。仮想関数をオーバーロードすると、新しい派生関数のみが呼び出されますか? それとも派生関数と基本関数の両方ですか? 仮想デストラクタが呼び出されると、ベースと派生クラスのデストラクタが呼び出されることに気付いたからです。

0 投票する
4 に答える
1158 参照

c++ - C++での継承と仮想デストラクタの問題

したがって、2つのクラスがあります。1つは抽象クラスで、もう1つはそうではありません。

抽象クラスはIteratorであり、具象クラスはLinkedListIteratorです。両方のコードは投稿の下部にあります。

私が抱えている問題は、以下のコードにあります。デストラクタの最後の行にあるLinkedListIteratorで1つのエラーが発生します。

ここで、仮想の〜Iterator()デストラクタをコメントアウトしようとしましたが、エラーは発生しませんでしたが、次のような警告が表示されます。

だから私の質問は:抽象イテレータ基本クラスに仮想デストラクタが必要ですか?常に1つある必要があることを読みましたが、この場合、LinkedListIteratorのデストラクタは値を設定するだけで、何も解放しません...

ありがとう!

イテレータコード:

関連するLinkedListIteratorコード(これは長いクラスです):

0 投票する
2 に答える
3975 参照

c++ - 継承階層におけるデストラクタの順序付け

次の階層がある場合:

  • クラス F には、型のメンバー オブジェクトが含まれます (クラス E およびクラス D、この順序で宣言されます)。
  • クラス F は具体的なクラス クラス C を継承します
  • クラス C は、抽象/純粋仮想クラス クラス B を継承します
  • クラス B は具体的なクラス クラス A を継承します

クラス F 型のオブジェクトのデストラクタが呼び出されると、次のことが次の順序で行われます。

  1. クラス F (最も派生した) デストラクタが呼び出され、終了します
  2. クラス D (メンバー オブジェクト 2) のデストラクタが呼び出されて終了する
  3. クラス E (メンバー オブジェクト 1) のデストラクタが呼び出されて終了する
  4. クラス C (F のベース) デストラクタが呼び出されて終了する
  5. クラスA(CのベースであるBのベース)デストラクタが呼び出され、終了します
  6. クラス B (仮想、C のベース) デストラクタが呼び出され、終了します

これは正しいです?つまり、基本的に終わりに向かって、C は仮想 B を継承し、仮想 B は A を継承しますが、C は破壊され、次に A、次に仮想 B になりますか?

編集: C++ FAQ は言う:

「仮想基本クラスは特別です。それらのデストラクタは、最も派生したクラスのコンストラクタの最後で呼び出されます」

私が理解しようとしているのはどれですか?

0 投票する
4 に答える
114 参照

c++ - C++ のデストラクタの概念

以下のコードを実行してください:

上記のコードでは、ポインターには派生クラス オブジェクトのアドレスが含まれているため、ポインターを削除するときに基本クラスのデストラクタと共に派生クラスのデストラクタを呼び出す必要がありますが、なぜ基本クラスのデストラクタのみを呼び出すのでしょうか。基本クラスのデストラクタを仮想として作成した場合、派生クラスと基本クラスのデストラクタの両方を呼び出すのはなぜですか? 仮想関数の場合、基本クラスと派生クラスの両方が同じ関数名を持っているため、コンパイラは派生クラスで最も派生したものを解決しますが、ここではデストラクタは同じ名前を持たず、コンパイラが呼び出す必要があるものをどのように解決するか実行中に。方法を説明してください

0 投票する
5 に答える
255 参照

c++ - 仮想メソッドなしで仮想デストラクタを使用することに害はありますか?

設計中に、仮想メソッドを追加/削除する状況が発生することがあります。私が知っている経験則は、仮想メソッドを取得したら、仮想デストラクタを使用することです。

私の質問:クラスを作成するときに仮想デストラクタをすぐに追加した場合(仮想メソッドがまだない場合でも)、害はありますか?基本的には、後で忘れないようにするのが目的です。特にn個の派生クラスでは、後でn個の場所で変更する必要はありません。