GNUコンパイラの警告"のクラスの仮想関数が非仮想デストラクタ"

StackOverflow https://stackoverflow.com/questions/127426

  •  02-07-2019
  •  | 
  •  

質問

私の定義のインタフェースにC++、クラスだけをもつ純粋な仮想関数.

いを明示的に禁止ユーザーインターフェースを削除するオブジェクトを指すポインタのインタフェースで宣言される保護および非仮想デストラクタのためのインタフェースのようなもの:

class ITest{
public:
    virtual void doSomething() = 0;

protected:
    ~ITest(){}
};

void someFunction(ITest * test){
    test->doSomething(); // ok
    // deleting object is not allowed
    // delete test; 
}

GNUコンパイラなど、あらゆる警告ん:

クラス'ITest"の仮想関数が非仮想デストラクタ

一度のデストラクタが保護されているので、何か違いはあることで仮想非仮想?

いると思いこの警告できる安全に無視し、又は黙?

役に立ちましたか?

解決

少しでもバグをコンパイラです。るということに注意してくだ最近のバージョンのコンパイラこの警告はなされ(少なくとも4.3ません).このデストラクタの保護および非仮想は完全に正当なおす。

こちらの 優れた記事によるハーブサタ用になれます。からの記事:

ガイド#4:基底クラスデストラクタは公共および仮想は、保護nonvirtual.

他のヒント

一部のコメントこの答えに関すが、それと比較して、回答したのは、間違っています。

保護されたデストラクタはこちらからだけ呼び出すことができますから、基底クラスくなる"ケられ"が発生削除します。ということは、ITestで保護されている情報を直接削除され、導出クラスです。派生クラスもた仮想デストラクタ.間違っている訳ではないコードです。

しかし、できない地域を無効に警告を発するGCC、既にvtableすことを検討してはどうかと思うだけのデストラクタは仮想ですよね。でおすすめの4バイトのためのプログラム(クラスインスタンス)、最大値.ていた自由来のクラスの仮想dtorすることです。

ば、見ていて気分が良いものパス -Wno-non-virtual-dtor にGCC.この警告はなさそうして動作させる為には、デフォルトでは、だいて有効で -Wall または -Weffc++.しかし、かの有用な警告がほとんどの状況その一環として行われたくなる場合もあります

このインターフェースのクラスで合理的な削除象の実施そのインタフェースによるインターフェース。共通の例ではインターフェースのために作成したオブジェクトの工場に返される必要がある。(有オブジェクトのポインタを工場出荷が非常に高価である).

私の観測は、GCC whining.代わりに、単に警告を削除するときに、ITest*.このような場合は、危険性があると考えています。

私の個人的な見解といって、正しいものや、コンパイラが壊れています。思を無効に警告し、地域のファイルを定義するインタフェース)可能な場合は、

またその結果が、先ほど任天堂さんのパターン(小型'p')です。実際に見ることは少ない私のインタフェースを守りdtorsてそれぞれについてとして公開した。しかしいと思いますので実際に共通するム(でんお話をう)思うに警告を追加したGCCでは適当でないし、実施の'dtorな仮想い仮想関数の間の規則です。個人として更新されるルールをdtorな仮想い仮想関数を、ご希望のユーザーを抹消することができるものとのインスタンスのインタフェースの他のdtor保護すべきおよび非仮想の年齢前の;)

場合にはデストラクタは仮想される可能性があるためです。る基底クラスデストラクタとも呼ばれる前に清掃活動、そうでないもの漏洩によるコードです。そのプログラム等の警告(prefferablyな警告した。

またコードの ITest's方法を試みた delete 自るのは悪いことが法的に導出クラスのデストラクタになると呼び出されます。すべりをしながら作のデストラクタは仮想できない予定を削除するに由来インスタンスを介してベースクラスのポインタです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top