8
votes

Destructeur virtuel pour boost: classes non gênantes?

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;
}


2 commentaires

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).


5 Réponses :


13
votes

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.


0 commentaires

3
votes

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.

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.


6 commentaires

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 ne peut pas être supprimé (par des agents externes) sous forme de Boost :: Non géré 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.



9
votes

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.

dériver votre classe de boost :: non géré ne compte pas vraiment comme étant dérivé d'une classe de base. Boost :: Non géré 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é . Et même s'ils faisaient que votre destructeur virtuel ne vous aiderait pas parce que le destructeur non gourmable n'est pas.

Et enfin, comme cela a été signalé dans un commentaire, vous héritez même de privé de Boost :: Non gère Ce n'est donc même pas vraiment vraiment héritage autant que quiconque en dehors de la classe est concerné. < / p>

Donc vraiment, pas besoin de le faire un destructeur virtuel.


1 commentaires

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é



3
votes

Destructeur virtuel dans la classe de base est utilisé pour éviter un problème de destruction partielle comme: xxx pré>

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 


0 commentaires

1
votes

boost :: non géré 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.

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 boost :: nonderivable à jolie ceci pour vous.


Comme mentionné dans le lien, C ++ 11 vous permet de déclarer la classe < Code> final : xxx


1 commentaires

Lien brisé. Je m'intéresse à.