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.)
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-specifierfinal
et dans une classe D dérivée de B une fonctionD::f
remplaceB::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.