web-dev-qa-db-ja.com

デストラクタは最終的なものですか?

C++標準では、デストラクタをfinalとして宣言できますか?このような:

 class Derived: public Base
 {
      ...
      virtual ~Derived() final;
 }

もしそうなら、それは派生クラスの宣言を防ぎます:

 class FurtherDerived: public Derived {// allowed?
 }

isが許可されている場合、コンパイラは警告を発行する可能性がありますか?デストラクターをfinalとして宣言することは、クラスが基本クラスとして使用されることを意図していないことを示すための実行可能なイディオムですか?

究極の基本クラスでこれを行う意味はありません 、派生クラスのみです。)

35
Raedwald

C++デストラクタをfinalとして宣言できますか?

はい。

もしそうなら、それは派生クラスの宣言を防ぎます:

はい、派生クラスはデストラクタを宣言する必要があるため(明示的にまたはコンパイラによって暗黙的に)、デストラクタはfinalと宣言された関数をオーバーライドします。これは不正な形式です。

ルールは [class.virtual]/4

クラスBの仮想関数fvirt-specifierfinalおよびクラスDでマークされている場合Bから導出された関数D​::​fオーバーライドB​::​f、プログラムの形式が正しくありません。

派生物自体が不正な形式であるため、使用する必要はありません。

デストラクタをfinalとして宣言することは、クラスが基本クラスとして使用されることを意図していないことを示すための実行可能なイディオムですか?

事実上、クラスfinalをマークするだけです。かなり明確です。

58
Barry