38 votes

Un destructeur peut-il être final ?

La norme C++ permet-elle de déclarer un destructeur en tant que 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 elle es autorisé, un compilateur est-il susceptible d'émettre un avertissement ? Est-ce que déclarer un destructeur pour être final un idiome utilisable pour indiquer qu'une classe n'est pas destinée à être utilisée comme classe de base ?

(Il y a aucun intérêt à faire cela dans une classe de base ultime seulement une classe dérivée).

58voto

Barry Points 45207

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

Sí.

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

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

La règle est la suivante [classe.virtuelle]/4 :

Si une fonction virtuelle f dans une certaine classe B est marqué avec le spécificateur virtuel final et dans une classe D dérivée de B une fonction D​::​f Remplacer B​::​f le programme est mal formé.

C'est la dérivation elle-même qui est mal formée, il n'est pas nécessaire de l'utiliser.

Déclarer qu'un destructeur est final est-il un idiome utilisable pour indiquer qu'une classe n'est pas destinée à être utilisée comme classe de base ?

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X