-
Ce n'est pas feu le CUJ qui a été cité, mais Herb Sutter. On retrouve donc cette phrase dans le GOTW et dans son Coding Standards. L'auteur, la maison d'édition, et le titre du bouquin vont faire que cette "règle" risque de s'imposer.
Sinon, je parlais bien d'un destructeur protégé (et non-virtuel). Le fait qu'il n'ait aucune fonction virtuelle dans sa classe mère non instanciable me fait dire que :
- soit il part sur une classe agglomérat de données et autres fonctions qui sert de base à la définition d'autres classes (réutilisation de code) ; je ne vois pas de manipulation polymorphique des données
- soit il part pour faire des dynamic_cast dans tous les sens ; là il faut bien le destructeur virtuel, mais le design sens le moisi.
Il est vrai qu'il pourrait y avoir des cas intermédiaires, mais j'ai plus supposé que le design n'était pas moisi et de la première catégorie. Du coup, l'intérêt du destructeur public est vite faible. Mais bon.
Dans tous les cas seule la présence d'une fonction membre virtuelle-pure garantit la non-instanciabilité.
EDIT: grosse bétise dans le dernier paragraphe.
-
Désolé pour le non respect dut au monsieur ...
Je suis quand même demandeur de l'utilitée d'un destructeur non virtuel autre que vide et servant à émettre une erreur de compilation ...
Au fait, dans l'exemple de l'article, si j'ai bien tout lu, il aurait été plus propre de mettre l'operateur delete en protégé plutôt que le destructeur ...
-
Pas une question de respect. Juste une constatation : c'est un auteur influent. Et à l'exception de quelques trucs, ce qu'il écrit tend à faire force de loi -- comme avec les autres auteurs influents.
Un des intérets des destructeurs protégés non virtuels, c'est aussi pour les classes qui n'ont pas une sémantique d'entité. On définit des services qui seront importés par des classes filles qui vivent sur la pile. La classe mère n'est pas instanciable sur la pile. Du coup, protéger le delete n'empêche pas grand chose.
Mais il est vrai que l'on peut se contenter de mettre tous les constructeurs en protégé ou privé -- pour en revenir à la question de l'OP.
La question du destructeur protégé non-virtuel dans une classe de base vient de la dichotomie :
- soit on veut une destruction polymorphique -> public virtuel
- soit on ne la veut pas (ex. typique: les politiques) -> protégé non-virtuel
-
:arf:, po tout compris je crois que ca ira mieux le jour ou je se serait confronté au pb.
Pis c'est un sujet qui à fait coulé beaucoup d'encre les destructeurs non virtuels. On va pas partir dans un HS infini.