J'ai une question sur le code suivant:
class MyClass : private boost::noncopyable { public: MyClass() {} virtual ~MyClass() {} } class OtherClass : private boost::noncopyable { private: MyClass* m_pMyClass; }
5 Réponses :
Non, le point entier d'un destructeur virtuel est tellement dérivé des classes dérivées de manière proprement détruit polymorphiquement. Si cela ne sera jamais une classe de base, vous n'en avez pas besoin pour être virtuel. P>
Je ne suis vraiment pas un fan de la classe Boost :: une classe non gênante dans son ensemble. Pourquoi ne pas simplement déclarer le constructeur de copie et l'opérateur d'affectation de votre classe privée et ne les définissez pas. Cela accomplira la même chose et vous pouvez abandonner le destructeur virtuel. P>
Boost fournit seulement un destructeur virtuel de sorte que les gens puissent passer autour de Boost :: objets non couchés polymorphes et les ont toujours bien se comporter bien. Techniquement, si vous n'utilisez pas la classe polymorphique (vous pouvez même toujours hériter de celui-ci), vous n'avez vraiment pas besoin d'un destructeur virtuel. P>
Parce que Boost :: Non gère est plus lisible, comme ils se disent eux-mêmes.
Boost :: Non gère Non gère ne fournit pas de destructeur virtuel
La lisibilité est dans l'oeil du spectateur
@villintehastaspam: Il me semble qu'il serait extrêmement inhabituel de vouloir supprimer à l'aide d'un pointeur pour booster :: non géré.
MyClass Code> ne peut pas être supprimé (par des agents externes) sous forme de
Boost :: Non géré Code> De toute façon, car il utilise un héritage privé.
@Fred Larson: Exactement, cela n'a pas vraiment de sens - il n'y a donc aucune raison de le fournir.
La règle générale est si votre classe a des fonctions virtuelles, il a besoin d'un destructeur virtuel. Si ce n'est pas le cas, mais est toujours dérivé d'une classe de base, la classe de base (et donc votre classe) peut ou non avoir besoin d'un destructeur virtuel selon. P>
dériver votre classe de Et enfin, comme cela a été signalé dans un commentaire, vous héritez même de privé de Donc vraiment, pas besoin de le faire un destructeur virtuel. P> boost :: non géré code> ne compte pas vraiment comme étant dérivé d'une classe de base.
Boost :: Non géré CODE> ressemble davantage à une annotation pratique adossée à quelques déclarations qui causeront le compilateur à appliquer l'annotation. Ce n'est pas vraiment une classe de base dans aucun sens conventionnel. Personne ne va jamais essayer de transmettre un pointeur à votre classe en tant que pointeur ou référence à
Boost :: Non géré code>. Et même s'ils faisaient que votre destructeur virtuel ne vous aiderait pas parce que le destructeur code> non gourmable code> n'est pas. P>
Boost :: Non gère Code> Ce n'est donc même pas vraiment vraiment héritage autant que quiconque en dehors de la classe est concerné. < / p>
Il utilise un héritage privé, de l'extérieur de la classe, il apparaîtra comme n'hésite pas à partir de Boost :: non géré code>
Destructeur virtuel dans la classe de base est utilisé pour éviter un problème de destruction partielle comme: Lorsque vous héritez une classe privée, le compilateur n'effectuera pas de coulée implicite de dérivée à la classe de base et si vous Sont sûrs que l'objet dérivé n'est jamais détruit à l'aide du pointeur de la classe de base, alors vous n'avez pas besoin de destructeur virtuel dans la classe de base. P> Base *pBase = new Derived(); // will flash error
Il convient parfaitement à vous débarrasser du destructeur virtuel si vous ne décédez jamais de l'objet. Si vous souhaitez appliquer la stratégie "Ne décédez pas de cet objet", Il y a un moyen < / a>. Malheureusement, il n'y a pas de Comme mentionné dans le lien, C ++ 11 vous permet de déclarer la classe < Code> final code>: p> boost :: non géré code> est censé dire que vous ne voulez pas copie de l'objet fait. Vous savez que cela est différent de dériver de l'objet.
boost :: nonderivable code> à jolie ceci pour vous. P>
Lien brisé. Je m'intéresse à.
Si vous ne voulez pas soutenir l'héritage, envisagez de rendre le constructeur privé et d'avoir une fonction de création statique à la place.
Marcus: Bien que cela nécessite d'autres choses, il ne veut pas soutenir, comme la copie ou le passage des pointeurs autour (l'usine doit revenir en valeur ou renvoyer un pointeur).