IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

destructeur et méthodes virtuelles


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut destructeur et méthodes virtuelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct S0
    {
     ...
     virtual void Close();
     virtual ~S0() { Close(); }
    };
     
    struct S0D: S0
    {
     ...
     virtual void Close() { ...; S0::Close(); }
    };
    J'ai une méthode virtual Close() dans une classe de base qui est appelée par son destructeur. La classe dérivée surcharge cette méthode Close() en faisant un traitement spécifique puis appelle la méthode Close() parente. Il me semble que c'est une manière assez classique de coder.
    La problème survient quand on "oublie" de surcharger le destructeur de la classe dérivée. En fait je trouve assez pompant de devoir répéter le même code dans chaque destructor des classes dérivées, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     virtual ~S0_derived() { Close(); }
    Quelles sont vos habitudes de conception dans ce genre de cas ?
    Merci.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par camboui Voir le message
    Quelles sont vos habitudes de conception dans ce genre de cas ?
    Merci.
    Ne pas appeler de méthodes virtuelles dans le constructeur et le destructeur.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour ça, je conseillerais de rendre le destructeur abstrait, pour forcer à le redéfinir.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par camboui Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     virtual void Close() { ...; S0::Close(); }
    Est-ce-que la méthode Close() peut-être appelée autre-part que dans le destructeur ? Si ce n'est pas le cas, ça n'a aucun intérêt de faire ça : le destructeur de la classe dérivée appellera celui de la classe mère, qui appellera sa méthode Close(). Et dans le cas présent, SO::Close() sera appelée 2 fois : 1 fois dans SOD::Close(), puis une deuxième fois dans le destructeur de la classe mère.

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ne pas appeler de méthodes virtuelles dans le constructeur et le destructeur.
    Tu peux appeler des fonctions virtuelles mais il n'y aura pas de polymorphisme, la résolution des liens sera statique (cf ).
    D'où cette règle générale de ne pas le faire, mais du point de vue syntaxique, on peut le faire.

    Par contre, appeler une fonction virtuelle pure donne un comportement indéfini.

    Cf la norme en 10.4.6
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Tu peux appeler des fonctions virtuelles mais il n'y aura pas de polymorphisme, la résolution des liens sera statique (cf ).
    D'où cette règle générale de ne pas le faire, mais du point de vue syntaxique, on peut le faire.
    Oui. Mais j'ai préféré être catégorique car
    1/je n'ai jamais croisé de cas où c'était pertinent
    2/ca va tellement à l'encontre de ce qu'on peut penser à priori, que je serais tenté de considérer cette utilisation même en connaissance de cause comme une faute.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    OK, merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une méthode virtuelles
    Par BIPBIP59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/03/2006, 14h00
  2. Méthodes virtuelle et implémentation
    Par slate dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 17h16
  3. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 17h21
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 08h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo