2017-11-29 8 views
33

C++標準では、デストラクタをfinalと宣言できますか?このように:デストラクタが最終的になることがありますか?

それは が許可されている場合
class FurtherDerived: public Derived {// allowed? 
} 

、コンパイラは警告を発行する可能性がある:

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

もしそうなら、それは派生クラスの宣言を防ぐん

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

(唯一の派生クラス、no point in doing this in a ultimate base classあります。)

+3

クラスがベースとして使用されないことを示すためのイディオムは、そのクラスを最終的にすることです。 – juanchopanza

+7

クラスが継承元ではないことを示す場合は、クラス全体を「final」にすることができます。 'class Deverired final:public Base' –

答えて

55

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

はい。

もしそうなら

が、その派生クラスの宣言を防ぐん:

はい、派生クラスが(明示的または暗黙的にコンパイラによっていずれか)デストラクタを宣言する必要があるため、とそのデストラクタは無効な形で宣言された関数finalを無効にします。いくつかのクラスBの仮想関数f仮想環境指定子finalと機能D​::​fオーバーライドB​::​f、プログラムBから派生したクラスDにマークされている場合

ルールは[class.virtual]/4あります形成されていない。

これは不正な形式の派生物であり、使用する必要はありません。

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

効果的ですが、クラスfinalをマークするだけです。かなり明白です。

+12

" ...しかし、あなたはクラス 'final'をマークする必要があります。そして[両方を行うことは冗長になります](https://stackoverflow.com/questions/43704769/is-the-final-function-specifier-redundant-when-using-the-final-class-specifier)。 – Raedwald

関連する問題