0

ガイドライン#4リンクテキスト、状態:

基本クラスのデストラクタは、パブリックで仮想、または保護されて非仮想である必要があります。

何かが足りないかもしれませんが、基本クラスとして使用するように設計されていない具象クラスを作成した場合はどうなりますか。

デストラクタをパブリックおよび仮想であると宣言する必要がありますか?これにより、私のクラスは「基本クラスとして使用する準備ができている」と暗黙のうちに宣言しますが、これは必ずしも真実である必要はありません。

4

6 に答える 6

5

リンクテキストには、「基本クラスのデストラクタは次のようになります」と具体的に記載されています。

ガイドラインは、基本クラスとして使用するように設計されたクラスのみを対象としています。基本クラスとして使用されない単一の具象クラスを作成する場合は、パブリックコンストラクターを非仮想のままにしておく必要があります。

于 2009-11-10T21:07:54.507 に答える
0

あなたのクラスの他に仮想のものがなければ、デストラクタも仮想であるべきではないと思います。

于 2009-11-10T21:06:08.730 に答える
0

クラスが後で拡張される場合にのみ、デストラクタは仮想である必要があります。保護された/プライベートのデストラクタが必要な場合はわかりません。

仮想メソッドが1つでもある場合、デストラクタを仮想化することで(ほとんどのコンパイラで)何も失われないことに注意してください(ただし、誰かが後で拡張した場合に備えて保護されます)。

于 2009-11-10T21:06:26.110 に答える
0

別の方法で考えてみてください。クラスから絶対に派生しようとする人は誰もいないことを知っていますか。誰かがそうするとき、彼はあなたのdtorを詳しく調べることを忘れないだろうと思いますか。時々人々は正当な理由で構成よりも継承を使用します(醜いゲッター構文​​を持たずにクラスの完全なインターフェースを提供します)。
仮想dtorのもう1つのポイントは、オープン/クローズド原則です。
ハードリアルタイムパフォーマンスなどに関心がない場合は、仮想dtorを使用します。

于 2009-11-10T21:21:24.853 に答える
0

デストラクタは、次のいずれかの場合に仮想である必要があります

  • クラスには任意の仮想メソッドが含まれています。
  • 仮想的なものがない場合でも、クラスをベースとして使用することを計画しています。

まれな例外

  • あなたは4バイトを節約しようとしていますが、これが原因で仮想テーブルポインタは受け入れられない解決策です(例-何らかの理由でクラスは32ビットに収まる必要があります)。しかし、地獄に備えてください。

パブリックまたはプロテクトに関して-一般的に、デストラクタへのアクセスをどのように制御するかという問題があります。

于 2009-11-10T21:27:29.670 に答える
0

アドバイスは、多態的な基本クラスを意図した仮想関数を持つクラスに言及しています。誰かがdelete基本クラスポインタを呼び出すと、実際のクラスのデストラクタが呼び出されることを確認する必要があります。そうしないと、派生クラスによって割り当てられたリソースが解放されません。

これを実現するには、次の2つの方法があります。

  • パブリック仮想デストラクタ。実行時に正しいデストラクタが見つかります。また
  • 保護された非仮想デストラクタ。これによりdelete、基本クラスポインタの呼び出しが防止されます。

基本クラスとして使用されない具象クラスの場合delete、実際の型へのポインターのみを呼び出すため、アドバイスは適用されません。必要に応じて、パブリック非仮想デストラクタが必要です。

于 2009-11-10T21:59:14.903 に答える