La classe parent a une fonction virtuelle. Est-il nécessaire d’avoir un destructeur virtuel dans la classe parente?

La classe parent a une fonction virtuelle. Est-il nécessaire d’avoir un destructeur virtuel dans la classe parente?

Les questions sont donc 1. Considérant maintenant la règle de trois, devrions-nous déclarer les deux autres?

Un destructeur virtuel est requirejs chaque fois que la delete est appelée sur un pointeur vers cette classe où l’object supprimé est en réalité d’un type plus dérivé. Si votre classe de base peut être utilisée dans ce type de situation, vous devez fournir un destructeur virtuel.

Il est généralement conseillé d’append un destructeur virtuel à toute classe comportant des fonctions virtuelles car cela confère sécurité et flexibilité aux futurs utilisateurs de la classe. Le coût supplémentaire de l’ajout d’un destructeur virtuel à une classe déjà polymorphe est généralement faible.

Cette dernière règle n’est cependant qu’une règle de base. Il peut être nécessaire d’avoir un destructeur virtuel dans une classe même s’il n’a pas d’autres fonctions virtuelles et, inversement, un destructeur virtuel peut ne pas être nécessaire pour une classe polymorphe s’il n’est jamais utilisé dans un contexte qui le requirejs ( généralement, le destructeur serait protected ou même private pour l’appliquer).

Vous devez uniquement fournir un constructeur de copie défini par l’utilisateur et un opérateur d’affectation de copie si les implémentations par défaut fournies par le compilateur ne permettent pas de résoudre correctement le problème. Si vous avez ajouté un destructeur avec une implémentation vide uniquement pour le rendre virtuel, il est peu probable que vous ayez à fournir un constructeur de copie et un opérateur d’affectation de copie.

La seule vraie raison d’avoir un destructeur virtuel dans votre classe est si vous envisagez de supprimer des objects de cette classe de manière polymorphe , c’est-à-dire si vous envisagez de delete objects de la classe dérivée par le biais de pointeurs vers la classe de base. Si vous ne le faites jamais, vous n’avez pas besoin d’un destructeur virtuel.

Cependant, si vous avez déjà une fonction virtuelle dans votre classe, rendre le destructeur virtuel n’entraîne aucun surcoût appréciable (puisque le pointeur VMT a déjà été introduit dans votre object). Dans de telles circonstances, il peut être judicieux de rendre le destructeur virtuel. Au cas où.

Il est logique qu’une classe avec une fonction virtuelle ait un destructeur virtuel, car il s’agit d’une classe conçue pour être héritée de et probablement utilisée de manière polymorphe (voir la question SO correspondante ). Et si elle est utilisée de manière polymorphe, dans la mesure où un pointeur sur la classe parente pointe vers une instance d’un type dérivé, la classe parente doit avoir un destructeur virtuel.

D’autre part, il ne serait nécessaire de suivre la règle de trois dans le parent que si le destructeur de classe du parent faisait réellement quelque chose qu’un synthétiseur ne ferait pas (par exemple, traiter explicitement de la libération de certaines ressources). Si le destructeur du parent est sortingvial et déclaré uniquement pour permettre la destruction correcte des objects polymorphes à partir d’un pointeur de classe parent, il n’est pas nécessaire de fournir son constructeur de copie et son opérateur d’affectation de copie.

Techniquement, vous DEVEZ avoir un destructeur virtuel uniquement si vous allez supprimer des instances de manière polymorphe. En d’autres termes, vous pouvez avoir des méthodes virtuelles sans avoir un destructeur virtuel.

D’un sharepoint vue pratique, cependant, il y a rarement une raison pour que vous ne déclariez pas le destructeur virtuel et vous devriez le faire pour toute classe qui, selon vous, pourrait servir de base.

La règle de trois parle de la logique de programme: si vous avez une logique dans un destructeur, un constructeur de copie ou une affectation, vous avez probablement besoin de logique dans les trois. Notez cependant que ce n’est pas une règle ssortingcte d’un sharepoint vue formel et qu’il existe de rares cas où cela ne tient tout simplement pas (par exemple, je serais peut-être intéressé à voir une ligne dans un journal pour chaque object créé, mais pas en affectation. ou destruction).

Notez également que, selon mon expérience, lorsque vous avez un inheritance et un polymorphism, le typage sémantique et même statique de la copie en C ++ ne se sent parfois pas bien.

Toute classe qui pourrait être une classe de base d’un sharepointvrait avoir son destructeur déclarée virtuelle. Indépendamment du fait qu’un autre membre soit virtuel ou non.

La règle de trois dit que vous devez déclarer un

  • destructeur
  • constructeur de copie
  • opérateur d’assignation de copie

si vous en déclarez un. Indépendamment de savoir si la destruction est virtuelle.