Java et C# supportent la notion de classes qui ne peuvent pas être utilisées comme classes de base avec les mots-clés final
et sealed
. En revanche, en C++, il n'y a pas de bonne façon d'empêcher une classe d'être dérivée, ce qui laisse à l'auteur de la classe un dilemme, est-ce que chaque classe devrait avoir un destructeur virtuel ou non ?
Édition : Depuis C++11, ce n'est plus vrai, vous pouvez spécifier qu'une classe est final
.
D'une part, donner à un objet un destructeur virtuel signifie qu'il aura une vtable
et donc qu'il consommera 4 (ou 8 sur les machines 64 bits) octets supplémentaires par objet pour le vptr
.
D'autre part, si quelqu'un dérive plus tard de cette classe et supprime une classe dérivée via un pointeur vers la classe de base, le programme sera mal défini (en raison de l'absence d'un destructeur virtuel), et honnêtement, optimiser pour un pointeur par objet est ridicule.
D'un autre côté, avoir un destructeur virtuel (discutablement) annonce que ce type est destiné à être utilisé de manière polymorphe.
Certaines personnes pensent que vous avez besoin d'une raison explicite pour ne pas utiliser de destructeur virtuel (comme c'est le sous-texte de cette question) et d'autres disent que vous ne devriez les utiliser que lorsque vous avez des raisons de croire que votre classe est destinée à être dérivée, qu'en pensez-vous ?
1 votes
Il y a déjà des questions demandant les avantages et les inconvénients - est-ce un doublon, ou est-ce destiné à être un sondage d'opinion ? Si c'est le cas, peut-être devriez-vous créer des réponses "oui" et "non" pour le vote, puis fermer la question ? Je pense que c'est la façon recommandée de mettre en œuvre un sondage à choix multiples sur SO.
1 votes
Dupliqués: stackoverflow.com/questions/270917/…, stackoverflow.com/questions/300986/…
7 votes
"et franchement, optimiser pour un pointeur par objet est ridicule." - Ce n'est pas ridicule pour les petits objets. C++0x ajoute un conteneur forward_list, précisément parce que parfois, un surcoût d'un pointeur par objet est trop important en termes d'espace et de temps.
1 votes
@onebyone, cette question n'est pas un doublon de la première question que vous avez énumérée qui est spécifique aux classes abstraites et je fais référence à la seconde dans ma question, je ne pense pas que ce soit un doublon car la question est fortement biaisée en faveur d'avoir des destructeurs virtuels et je voulais une discussion ouverte.
0 votes
@Kyralessa, un geek doit faire ce qu'un geek doit faire :)
0 votes
Est-ce que cette réponse répond à votre question? Pourquoi devrais-je déclarer un destructeur virtuel pour une classe abstraite en C++?
0 votes
@bobobobo cette question ne concernait pas les classes abstraites, donc non, pas vraiment.