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 :

fonctions virtuelles et constructeurs


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut fonctions virtuelles et constructeurs
    Bonjour,

    je voulais savoir si on pouvait utiliser sans danger des fonctions virtuelles dans les constructeurs ? Y a-t-il des problèmes avec le "niveau" d'abstraction ?

    merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    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
    #include <iostream>
     
    struct A
    {
        A() { foo(); }
        virtual void foo() { std::cout << "A::foo" << std::endl; }
    };
     
    struct B : A
    {
        virtual void foo() { std::cout << "B::foo" << std::endl; }
    };
     
    int main()
    {
        B b;
    }
    Le résultat de ce code répondra à ta question.

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Je connais la réponse, je l'ai lu hier et l'avais testé également pour vérifier ^^

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Je connais la réponse, je l'ai lu hier et l'avais testé également pour vérifier ^^
    Maintenant, un peu plus difficile, saurais-tu expliquer pourquoi ?

  5. #5
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par Alp Voir le message
    Maintenant, un peu plus difficile, saurais-tu expliquer pourquoi ?
    D'après ce que j'ai compris, une fonction virtuelle possède une v-table (table virtuelle) qui contient des pointeurs de fonctions vers les versions contenues dans les classes filles. La classe virtuelle sait laquelle choisir. Mais après je ne sais pas exactement comment ça marche, je suis bien curieux !


  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Ce qui se passe, c'est que pour que pouvoir considérer que le contenu d'une classe dérivée est accessible, il faut attendre de se trouver après la liste d'initialisation (ou, si tu préfères, entre les deux accolades qui définissent le constructeur).

    Or, la classe de base est la toute première chose qui est initialisée.

    Il s'en suit que, lorsque tu te trouve dans le constructeur de la classe de base, la seule chose qui soit accessible, ce sont les membres (et les fonctions membres) de... la classe de base
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Merci, je dormirai moins bête ce soir

    Je trouve passionnant de connaître ce genre de détails !
    J'aime bien savoir comment les choses fonctionnent !

  8. #8
    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
    Un truc à savoir: Ce n'est pas le cas en .Net.

    J'avais lu un bon article quelque part là-dessus, mais impossible de le retrouver. Aussi, le lien était peut-être posté sur le forum, mais je n'en suis pas sûr...

    Enfin, en attendant, j'ai toujours trouvé ça:
    http://www.artima.com/cppsource/pure_virtual.html
    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.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ce n'est pas un probleme d'accessibilite (ce qui en C++ designe les protections introduites par public/protected/private) mais un probleme de type dynamique.

    Durant l'execution des constructeurs (et des destructeurs), le type dynamique est le type du constructeur (ou du destructeur) en cours d'execution.

    Un avantage est que cela evite de d'acceder a des membres non encore construits de la classe descendante. Si dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct S {
       S() { foo(); }
       virtual void foo() {}
    };
     
    struct D: S {
       void foo() { s = "D"; }
       string s;
    };
    c'etait D::foo() qui etait execute, s ne serait pas encore construit avec tous les problemes qu'on imagine.

  10. #10
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Interressant tout ça.

    Je suis en train de me documenter sur le mécanisme des fonctions virtuelles avec les v-table/v-pointeur, RTTI, ...

    C'est en comprenant les mécanismes internes qu'on peut mieux programmer et éventuellement éviter certains bugs

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Interressant tout ça.

    Je suis en train de me documenter sur le mécanisme des fonctions virtuelles avec les v-table/v-pointeur, RTTI, ...

    C'est en comprenant les mécanismes internes qu'on peut mieux programmer et éventuellement éviter certains bugs
    http://ldeniau.web.cern.ch/ldeniau/html/oopc.html, tout en bas: C++ Object Model.

  12. #12
    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
    Never call virtual functions during construction or destruction. (Scott Meyers).

    En fait, à mon avis c'est aussi lié à la compréhension de ce qui se passe pendant la construction d'un objet, et en particulier de l'ordre dans lequel les objets sont construits. J'avais fait une réponse, mais j'arrive pas à trouver un articule plus précis.

Discussions similaires

  1. Compilation avec des fonctions virtuel pure
    Par vanitom dans le forum C++
    Réponses: 4
    Dernier message: 16/12/2005, 14h37
  2. masquage de fonction virtuelle
    Par julien.sagnard dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 14h00
  3. Réponses: 2
    Dernier message: 07/10/2004, 17h00
  4. fonctions virtuelles
    Par Mau dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 21/11/2003, 09h53

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