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 :

[pure virtual call] erreur d'execution


Sujet :

C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut [pure virtual call] erreur d'execution
    salut,

    je comprend pas trop, mais mon code plante sur un polymorphisme.
    Soit 3 lasses. La première est abstraite et contient une methode virtuelle pure. Et les deux autre classe hérite de la première implemente cette methode virtuelle. Mais lors de l'appelle à cette methode ( l'appel est fait dans la classe abstraite), je tombe jamais dans le code d'une des classe fille. Ca me plante mon programme. Le debugger me dit : R6025 Pure virtual function call.

    des idées ?
    Pour les details, cherche tout seul !

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Tu ne ferais pas cet appel dans le constructeur de la classe de base des fois?
    Ça se n'est pas possible, car dans le constructeur de la classe de base this n'est pas construit pour le type dérivé.

    SInon pense bien a appeller cette méthode virtuelle sur this...

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est ce que je me disais, mais l'appel à un constructeur contenant une fonction virtuelle pure ne devrait pas passer la compilation... a priori

  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
    Si ça passe.

    Autre cas de figure:
    - un thread vent de détruire ton objet,
    - un second accède ensuite à une fonction virtuelle de l'objet
    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 chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Si ça passe.
    Au temps pour moi. En y pensant, j'avais déjà eu le problème. Honte à moi!
    Donc en monothread, c'est bien ça... Surtout pas d'appel à une fonction virtuelle pure dans un constructeur, l'objet dérivé n'existe pas encore, comme l'a déjà fait remarqué MatRem.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Je réponds un peu tard mais je viens d'avoir le problème. Es-tu sur VC6 ? c'est mon cas.

    Voilà le pourquoi de l'erreur :

    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:
      virtual void Do() = 0;
    };
     
    class B : public A
    {
    public:
      B() {}
    };
     
    int main()
    { 
      B().Do();
      return 0;
    }
    Ce code ne compile pas et c'est logique : B ne définit pas Do() donc il n'a pas le droit d'être instancié.
    Maintenant si j'écris:
    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:
      virtual void Do() = 0;
    };
     
    class B : public A
    {
    public:
      B( int ) {}
    };
     
    int main()
    { 
      B( 'Boom' ).Do();
      return 0;
    }
    VC6 compile et ça fait Boom à l'exec.

    Evidement c'est pas toujours écrit aussi clairement dans le code et, moi, je me suis fait avoir via un algo avec des find_if imbriqués...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est donc un bug de VC6 qui autorise à instancier une classe abstraite quand on ne passe pas par le constructeur par défaut ?
    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.

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    De toute façon, VC 6

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est donc un bug de VC6 qui autorise à instancier une classe abstraite quand on ne passe pas par le constructeur par défaut ?
    It's not a bug, it's a feature.

    Plus prosaïquement, VC6 n'est pas un compilateur C++. C'est un bon compilateur C89, qui gère quelques extensions orientée objet dont la syntaxe est proche d'un langage qu'à l'époque, on appelait C++ - mais sans vraiment savoir ce que ce langage faisait vraiment.

    Avec les alternatives qu'on a maintenant (et notamment les version Express de Visual C++ 2005 et 2008), je me demande comment on peut encore compiler des programmes avec cet antiquité. No offense intended, bien sûr.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Mon chef de projet tente de migrer vers 2008. On peut comprendre que ce n'est pas évident puisqu'on a plusieurs grosses applis en vc6 qui sont elles mêmes basées sur un framework vc6 commun, lui même utilisant parfois des vieux composants achetés ça et là qui apparemment posent pas mal de problèmes et n'ont plus de mise à jour.

    Il faut sacrifier du temps pour faire le portage, syncroniser le portage pour toutes les applis et les équipes qui bossent dessus. Lorsqu'on présente le portage à un directeur qui ne veut pas comprendre l'investissement (après tout l'appli marche comme alors à quoi ça sert de sacrifier tant de temps? Et les nouvelles fonctionnalités prévues?)...

    donc vala

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

Discussions similaires

  1. Erreur dans la surcharge de fonction pure virtual
    Par Razgriz dans le forum Débuter
    Réponses: 2
    Dernier message: 01/10/2009, 17h56
  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: 4
    Dernier message: 17/05/2007, 16h47
  4. [LDAP][Interface Winldap.h] Erreur d'execution
    Par -=Spoon=- dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 10/03/2005, 17h10
  5. [javamail] erreur d'execution
    Par bibx dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 05/12/2003, 11h04

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