Maison > développement back-end > C++ > Les classes de base abstraites devraient-elles avoir des destructeurs virtuels purs ?

Les classes de base abstraites devraient-elles avoir des destructeurs virtuels purs ?

DDD
Libérer: 2024-12-14 04:13:16
original
902 Les gens l'ont consulté

Should Abstract Base Classes Have Pure Virtual Destructors?

Destructeurs virtuels purs en C : une mise en garde

L'utilisation de destructeurs virtuels purs en C peut soulever des inquiétudes, notamment dans le contexte de classes de base abstraites. Examinons un scénario et ses conséquences potentielles.

Question :

Est-il acceptable de définir une classe de base abstraite avec un destructeur virtuel pur, comme le montre ce qui suit exemple ?

class A {
public:
    virtual ~A() = 0;
};
Copier après la connexion

Réponse :

Non. Définir une classe de base abstraite avec un destructeur virtuel pur seul est insuffisant. Cela conduit potentiellement à un comportement indéfini.

Lorsqu'un objet est supprimé ou détruit, les destructeurs de ses classes de base sont appelés dans l'ordre inverse de leur déclaration. Si une classe de base abstraite a un destructeur virtuel pur sans implémentation, le compilateur ne générera pas de code pour celle-ci.

Cette absence d'implémentation signifie que lorsqu'une classe dérivée est supprimée, le destructeur virtuel pur de l'abstrait la classe de base sera appelée, appelant un comportement non défini. Dans certains cas, cela peut entraîner un crash.

Solution :

Pour résoudre ce problème, il est essentiel d'implémenter le destructeur virtuel pur dans la classe de base abstraite . La définition suivante devrait suffire :

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }
Copier après la connexion

Cette implémentation fournit une implémentation par défaut qui ne fait rien. En définissant ce destructeur en ligne sans implémentation, nous garantissons que le destructeur virtuel pur est implémenté sans affecter la fonctionnalité des classes dérivées.

Il convient de noter que si vous dérivez des classes de A et tentez de supprimer ou de détruire eux, le destructeur de A sera finalement appelé. Par conséquent, il est crucial d’implémenter le destructeur virtuel pur pour éviter un comportement indéfini et des plantages potentiels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal