C.35: Une classe de base destructor doit être publique et virtuelle ou protégé et nonvirtual
Destructeur fonctions virtuelles de la classe de base soit ouvert, ou est une fonction non virtuelle protégée
Raison (raison)
Pour éviter un comportement non défini. Si l'destructor est publique, le code appelant peut tenter de détruire un objet de classe dérivée par un pointeur de classe de base, et le résultat est indéfini si le destructeur de la classe de base est non-virtuelle. Si le destructor est protégé, code d'appel ne peut pas détruire par un pointeur de classe de base et la destructor n'a pas besoin d'être virtuel; il n'a pas besoin d'être protégés, et non privée, de sorte que Destructeurs dérivées peuvent l'invoquer. En général, l'auteur d'une classe de base ne sait pas l'action appropriée à faire sur la destruction.
Afin d'éviter un comportement non défini. Si le destructor est public, le code appelant tentera d'utiliser le pointeur de classe de base côté à une classe dérivée d'objets détruire, lorsque le résultat n'est pas défini lorsque la classe de base destructor fonctions non virtuelles. Si le destructor de protection, le code côté appel qui ne peut être détruit par le pointeur de type de base d'objets dérivés, il est nécessaire destructor doit être virtuelle. Destructeur est de protéger, plutôt que privé, de sorte que la destructor classe dérivée peut l'invoquer. En règle générale, le concepteur de la classe de base ne sait pas quelles actions doivent être effectuées dans le destructor.
Discussion (discussion)
Voir ce dans la section Discussion: voir la section de discussion:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-dtor.
Exemple, mauvais (échantillon négatif)
struct {// base BAD: a implicitement une nonvirtual publique destructor
virtual void f ();
};
struct D: Base de {
chaîne s { "un nettoyage besoin de ressources"};
~ D () {/ * ... faire un nettoyage ... * /}
// ...
};
utilisation void ()
{
unique_ptr <Base> p = make_unique <D> ();
// ...
} // appels de destruction de p ~ base (), non ~ D (), qui fuit D :: s et peut - être plus
Balayez vers la gauche ou la droite pour voir plus
Note (Note)
Une fonction virtuelle définit une interface pour les classes dérivées qui peuvent être utilisés sans regarder les classes dérivées. Si l'interface permet de détruire, il doit être sûr de le faire.
fonction virtuelle dérivée définit les classes d'interfaces, il ne peut pas concerné par le cas d'utilisation de la classe dérivée. Si l'interface permet à un objet, le processus de destruction doit être en sécurité.
Note (Note)
Un destructor doit être ou non privées, il empêchera l'utilisation du type:
Destructeur doit être non-privé, sauf qu'il ne veut pas que d'autres à utiliser. (Ceci peut être contrôlé par une classe de sa propre destruction, Note du traducteur)
class X {
~ X (); // privé destructor
// ...
};
utilisation void ()
{
X a; // erreur: ne peut pas détruire
auto p = make_unique <X> (); // erreur: ne peut pas détruire
}
Exception (exception)
On peut imaginer un cas où l'on pouvait vouloir un destructor virtuel protégé: Lorsqu'un objet d'un type dérivé (et uniquement du type tel) devrait être autorisé à détruire un autre objet (pas lui-même) par un pointeur vers la base. On n'a pas vu un tel cas dans la pratique, cependant.
On peut imaginer une fonction virtuelle est nécessaire de protéger la situation destructor: Lorsque l'on souhaite permettre la destruction de l'objet (uniquement ce type) classe de base par le pointeur de la classe dérivée à un autre objet (pas son propre). Mais nous n'avons pas la situation telle rencontre dans le développement réel.
Application (Suggestions)
-
Une classe avec des fonctions virtuelles doit avoir un destructor qui est soit publique et virtuelle ou bien protégée et non virtuelle.
-
A une classe de fonction virtuelle de fonction virtuelle soit des fonctions virtuelles publiques, que ce soit pour protéger les fonctions non virtuelles.
Note du traducteur: fonctions virtuelles a généralement des moyens qu'il a classes dérivées.
Lien original:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c35-a-base-class-destructor-should-be-either-public-and-virtual-or-protected-and-nonvirtual
Je pense que cet article utile? Bienvenue pouces et partager avec plus de gens.
Lire la suite des articles mis à jour, s'il vous plaît attention à numéro public micro-canal de la pensée orientée objet []