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 :

[FAQ] initialisateur, appel de méthodes


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut [FAQ] initialisateur, appel de méthodes
    Bonjour à toutes et à tous,
    je m'interroge sur cette phrase trouvée dans la FAQ
    http://c.developpez.com/faq/cpp/?pag..._utiliser_this

    Citation Envoyé par Marshall Cline
    Voilà quelque chose qui ne fonctionne jamais : le (corps du) constructeur (ou une fonction appelée par lui) ne peut pas descendre dans une classe dérivée en appelant une méthode virtual qui est redéfinie dans une classe dérivée. Si votre but était d'exécuter le code de la fonction virtuelle, ça ne fonctionnera pas.
    J'ai l'impression qu'il n'est possible de faire l'opération décrite qu'avec une utilsation de downcasting. Pourtant cela n'est pas indiqué par l'auteur, donc je me dis que je ne comprends pas tout. Qu'en est-il exactement ?
    Je vous remercie par avance de m'éclairer.

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ben la virtualité c'est plus ou moins ce que tu entends par downcasting non ?
    Il veut dire que si tu tentes d'appeler une méthode virtuelle de la classe dérivée dans ton constructeur ça marchera pas.

  3. #3
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    Merci c'est bien ce qui me semblait.
    Et je trouve surprenant que des gens puissent faire appel à une méthode de la classe dérivée quand ils créent lune instance de la classe de base.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Bin, ça peut arriver assez naturellement : Par exemple, imagine la hiérarchie bateau d'une classe Forme avec des dérivées Rond et Rectangle.

    Si on veut qu'après chaque changement de taille, on affiche la forme, la méthode classique consiste à appeler la fonction virtuelle Forme::affiche() directement dans le code de la fonction Forme::resize(), avec appel dynamique (Rond::affiche() sera appelé, par exemple).

    De même façon, si on veut qu'une forme soit affichée en permanence à l'écran, il peut sembler assez naturel de mettre un appel à affiche() dans le constructeur, et comme on veut vérifier ça pour n'importe quelle forme, on souhaites mettre cet appel directement dans le constructeur de la classe de Base, Forme. Et là, c'est la fonction Forme::affiche (et jamais Rond::affiche) qui sera appelée. Et si en plus d'être virtuelle, Forme::affiche est pure, boom.

    Certains ont proposé de définir deux constructeurs : Un comme celui actuel, et un autre nommé post-constructeur. La séquence d'appel automatique à la création d'un objet serait alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct A{};
    struct B:A{};
    struct C:B{};
     
    C c;
    =>
     A::A() // Type dynamique == A
     B::B() // Type dynamique == B
     C::C() // Type dynamique == C
     A::post-A() // Type dynamique == C
     B::post-B() // Type dynamique == C
     C::post-C() // Type dynamique == C
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    j'ai un petit doute du coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class B : public A {}
    A *a=new B;
    Dans ce bout de code on ne fait pas appel au constructeur de A sauf dans B.

    ce qui ne marche pas serait en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A {
    virtual void affiche();
    A() {
    affiche();
     }
    };
     
    class B : public A {
    //redéfinition de affiche
    }
     
    B b; // pas ce qu'on veut car appel du constructeur A et donc utilisation de A::affiche()
    en fait il me manquait bien quelque chose, car je ne voyais qu'un dynamic_cast pour arriver à une telle situation (celle évoquée dans la FAQ)

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je crois que tu as compris.

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

Discussions similaires

  1. Appeler une méthode dynamiquement
    Par doof dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/01/2005, 23h15
  2. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  3. appel entre méthodes de meme classe
    Par frmaniako dans le forum C++
    Réponses: 8
    Dernier message: 10/09/2004, 22h55
  4. [Débutant] [JSP] Appel de méthode
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 10/09/2004, 11h10
  5. [Débutant] Héritage & appel de méthodes
    Par KooX dans le forum Langage
    Réponses: 4
    Dernier message: 11/05/2004, 23h37

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