C++ Possible de faire en sorte qu'un destructeur n'appelle PAS le destructeur des membres de la classe et le destructeur de la classe de base ?
Existe-t-il un moyen de faire en sorte qu'un destructeur d'une classe n'appelle PAS le destructeur de l'un des membres de la classe et/ou n'appelle PAS le destructeur de sa classe de base ?
Si cela n'est pas possible, est-ce que créer certains membres de la classe avec un nouveau placement et les détruire (/non-destructer) manuellement est-il une solution de contournement possible ? Merci!
EDIT : La raison pour laquelle j'ai besoin de ça : la classe C possède l'objet M. M a un destructeur non trivial. C est ami de M et gère M de manière à ce qu'il n'y ait pas besoin d'appeler le destructeur de M. Il est correct de l'appeler, mais cela signifie une surcharge de performances. (c'est un problème dans ce cas.) Je pensais créer une classe dérivée de M qui a un destructeur qui ne fait rien, mais cela appellerait toujours le destructeur de la base.
Au moment de la construction, C++ s'assure que les constructeurs des sous-classes sont d'abord appelés, puis les membres sont construits et enfin le constructeur approprié est appliqué. Au moment de la destruction la symétrie est faite.
Cela signifie que vous ne pouvez pas empêcher l'application d'un destructeur de classe de base, ni d'aucun constructeur membre, dès que l'objet est détruit . Si vous ne voulez en détruire que certains, vous devez trouver un moyen de ne pas détruire l'objet (utilisez simplement un pointeur brut...) et appeler manuellement les destructeurs sur ce que vous voulez. Mais vous ne voulez certainement pas faire ça !
C++ est très confiant sur les compétences du programmeur, il est donc facile d'écrire un programme invoquant un comportement indéfini. Si vous essayez de subvertir le compilateur C++ pour ne pas appeler le destructeur d'une classe de base ou d'un membre, vous avez un problème majeur. Le membre que vous ne voulez pas détruire ne doit pas être un membre mais plus probablement un pointeur (brut ou partagé) ou une référence à un objet externe qui aura sa propre gestion de durée de vie. Et la classe de base devrait probablement aussi être un pointeur ou une référence vers un objet externe, et là encore la durée de vie peut (et devrait) être gérée en dehors de la classe.