Définir des destructeurs virtuels purs en C : dévoiler les pièges
Le concept de destructeurs virtuels purs en C soulève des questions importantes concernant la mise en œuvre correcte de classes de base abstraites. Considérez l'extrait de code suivant :
class A { public: virtual ~A() = 0; };
La question se pose de savoir si cette approche est appropriée pour définir une classe de base abstraite. Bien qu'il se compile avec succès dans MSVC, il existe des inquiétudes quant au fait que cela puisse entraîner des plantages d'exécution.
Dévoilement du problème
Le problème vient du manque d'implémentation pour le virtuel pur. destructeur. Lorsque des classes dérivées sont créées à partir de A, leurs destructeurs finiront par invoquer le destructeur de A. Cependant, comme le destructeur de A est pur, l'appel entraînera un comportement indéfini.
Résoudre l'écueil
Pour éviter ce crash d'exécution, il est essentiel d'implémenter le destructeur dans la classe de base elle-même. Une simple implémentation en ligne, comme indiqué ci-dessous, suffira :
class A { public: virtual ~A() = 0; }; inline A::~A() { }
Cette implémentation garantit que lorsqu'une classe dérivée est supprimée ou détruite, le destructeur de A sera appelé et le programme se comportera comme prévu.
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!