Existe-t-il des circonstances dans lesquelles il est légitime qu'une entreprise dérivée ait un destructeur non virtuel ?
Oui.
Un destructeur non virtuel signifie qu'une classe ne doit pas être utilisée comme classe de base.
Pas vraiment ; un destructeur non virtuel signifie que la suppression d'une instance de derived
via un base
Le pointeur ne fonctionne pas. Par exemple :
class Base {};
class Derived : public Base {};
Base* b = new Derived;
delete b; // Does not call Derived's destructor!
Si vous ne faites pas delete
de la manière décrite ci-dessus, alors tout ira bien. Mais si c'est le cas, alors vous utilisez probablement la composition et non l'héritage.
Est-ce que le fait d'avoir un destructeur non virtuel d'une classe dérivée agira comme un destructeur de classe ? forme faible du modificateur final de Java ?
Non, parce que virtual
-s'étend aux classes dérivées.
class Base
{
public:
virtual ~Base() {}
virtual void Foo() {};
};
class Derived : public Base
{
public:
~Derived() {} // Will also be virtual
void Foo() {}; // Will also be virtual
};
Il n'y a pas de mécanisme intégré dans le langage C++03 ou antérieur pour empêcher les sous-classes(*). Ce qui n'est pas vraiment un problème de toute façon puisque vous devriez toujours préfèrent la composition à l'héritage . En d'autres termes, utilisez l'héritage lorsqu'une relation "is-a" est plus logique qu'une véritable relation "has-a".
(*) Le modificateur "final" a été introduit en C++11.