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 :

Warning "has virtual functions but non-virtual destructor"


Sujet :

C++

  1. #1
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut Warning "has virtual functions but non-virtual destructor"
    J'obtiens des warnings bizarres , enfin dont je comprend pas le sens, et ce depuis peu de temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class A has virtual functions but non-virtual destructor
    class B has virtual functions but non-virtual destructor
    Un extrait résume du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class A
    {
         public:
               ....
               A();
               ~A();
               inline virtual void Fonction() { }
               ....
    }
     
    class B : public A
    {
          public:
              ....
              B();
              ~B();
              void Fonction();
              ....
    }
    Quelqu'un aurait il une idée sur l'origine de ces warnings??
    Si le problème a une solution, il ne sert à rien de s'inquiéter. Mais s'il n'en a pas, alors s'inquiéter ne change rien.

    So Be en and Stay en

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Définir des fonctions virtuelles sous-entend que tu vas utiliser le polymorphisme, donc que tu vas peut-être détruire des instances dérivées à partir de pointeurs sur la classe de base. Dans ce cas, la classe de base doit définir son destructeur virtuel, sans quoi celui des dérivées ne sera jamais appelé.

  3. #3
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    Si le problème a une solution, il ne sert à rien de s'inquiéter. Mais s'il n'en a pas, alors s'inquiéter ne change rien.

    So Be en and Stay en

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ce n'est pas un warning de GCC inspiré par EC++ de Scott Meyer ?
    Ce qui est dommage, c'est qu'il ne sait pas reconnaitre que les destructeurs protégés non virtuels sont une exception parfaitement valable.

    PS: "inline" est ignoré quand "virtual" est spécifié, car incompatibles.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    En effet, je bosse en utilisant GCC, et ce qui est bizarre c'est que je n'ai pas ces warning sous windows mais uniquement sous linux (Meme compilateur, sous CodeBlocks)
    Si le problème a une solution, il ne sert à rien de s'inquiéter. Mais s'il n'en a pas, alors s'inquiéter ne change rien.

    So Be en and Stay en

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Luc Hermitte
    PS: "inline" est ignoré quand "virtual" est spécifié, car incompatibles.
    Il y a des appels a des membres virtuels qui se font sur des objets ou le compilateur connait le type statique, inline sert alors. (Le cas le plus evident est bien sur l'appel au destructeur d'une classe de base a la fin du destructeur de la classe derivee.).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Gcc nous sort aussi un warning lorsque l'on cree une Interface (classe virtuelle pure) qui n'a evidement pas destructeur virtuel...

  8. #8
    screetch
    Invité(e)
    Par défaut
    je crois que le warning auquel tu fais reference Luc est actoe avec -Weffc++ ou quelque chose comme ca. il est inutilisable en fait.

    Il dit que toute classe de base (c'est a dire dont on derive au moins une fois) doit avoir un destructeur virtuel. Comme ce n'est pas le cas dans la stl, g++ sort une floppée de messages warning inutiles

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par seed Voir le message
    Gcc nous sort aussi un warning lorsque l'on cree une Interface (classe virtuelle pure) qui n'a evidement pas destructeur virtuel...
    Il doit y avoir moyen dans le code, de spécifier que l'interface n'a pas de vraie vtable (donc ne peut être instanciée et n'a pas de destructeur). Cela devrait enlever ce warning.

    Quand au inline/virtual, c'est parfaitement compatible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class A
    {
    public:
         inline virtual ~A() { cout<<"toto"; }
    };
     
    class B : public A
    {
    public:
         inline virtual ~B() { cout<<"tata"; }
    };
     
    int main()
    {
        B  test;
    }
    En tout cas chez moi, le code généré a bien déroulé les deux inlines à l'interieur de la fonction main...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    screetch
    Invité(e)
    Par défaut
    l'inline du destructeur virtuel, comme tu l'as montré, marche tres bien lorsqu'on construit le destructeur de la classe fille. pas inutile du tout donc.

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

Discussions similaires

  1. Non-Virtual-Interface pattern et Python
    Par nikopol82 dans le forum Général Python
    Réponses: 9
    Dernier message: 19/02/2012, 18h25
  2. "Pure virtual function called" et destructeur virtuel
    Par Seb des Monts dans le forum C++
    Réponses: 9
    Dernier message: 10/09/2009, 16h54
  3. Réponses: 3
    Dernier message: 18/10/2006, 20h42
  4. [xsl][Java] functions xpath non interpretees
    Par Pi2 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 30/01/2006, 12h01
  5. performances des virtual functions
    Par xxiemeciel dans le forum C++
    Réponses: 2
    Dernier message: 25/07/2005, 17h24

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