web-dev-qa-db-fra.com

Un destructeur peut-il être définitif?

Le standard C++ permet-il de déclarer un destructeur comme final? Comme ça:

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

Et si oui, cela empêche-t-il la déclaration d'une classe dérivée:

 class FurtherDerived: public Derived {// allowed?
 }

Si est autorisé, un compilateur est-il susceptible d'émettre un avertissement? La déclaration d'un destructeur comme final est-elle un idiome réalisable pour indiquer qu'une classe n'est pas destinée à être utilisée comme classe de base?

(Il est inutile de faire cela dans une classe de base ultime , seulement une classe dérivée.)

35
Raedwald

Un destructeur C++ peut-il être déclaré comme final?

Oui.

Et si c'est le cas, cela empêche-t-il la déclaration d'une classe dérivée:

Oui, car la classe dérivée devrait déclarer un destructeur (soit explicitement par vous, soit implicitement par le compilateur), et ce destructeur remplacerait une fonction déclarée final, qui est mal formée.

La règle est [class.virtual]/4 :

Si une fonction virtuelle f dans une classe B est marquée avec le virt-specifier final et dans une classe D dérivée de B une fonction D​::​f remplace B​::​f, le programme est mal formé.

C'est la dérivation elle-même qui est mal formée, elle n'a pas besoin d'être utilisée.

La déclaration d'un destructeur comme final est-elle un idiome réalisable pour indiquer qu'une classe n'est pas destinée à être utilisée comme classe de base?

Effectivement, mais vous devez simplement marquer la classe final. C'est un peu plus explicite.

58
Barry