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 :

Méthode et héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Méthode et héritage
    Bonjour.

    J'ai une question très bête concernant les méthodes et l'héritage.

    Soit une classe A avec les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A();
    ~A();
    void fonction1();
    virtual void fonction2();
    void fonction3A();
    et une classe B dérivant de A avec les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    B();
    ~B();
    void fonction1();
    virtual void fonction2();
    void fonction3B();
    1) Pourriez-vous me dire quels fonction est appelée dans les cas suivants () :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A *a = new A();
    B *b = new B();
    b->fonction1(); // implémentation de A ou de B ?
    a->fonction2(); // implémentation de A ou de B ?
    b->fonction2(); // implémentation de A ou de B ?
    2) Maintenant, un peu plus sioux, supposons que le constructeur de A fasse appel à fonction1() (de A donc). Si le constructeur de B est laissé vide que se passera-t-il ? (est-ce que fonction1() sera appelée et si oui est-ce que ce sera l'implémentation de A ou de B)

    3) Dans l'implémentation du constructeur de B, comment faire si je veux que le constructeur de A soit appelé et qu'ensuite certaines fonctions propres à B soient appelées ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Salut.

    Il est pourtant facile de vérifier les questions que te pose ton prof, non ?

    1- just do it.
    NB: tu as oublié a->fonction1();

    2- just do it

    3- Qu'as-tu essayé de faire pour l'instant et quels sont les résultats ? Pourquoi correspondent-ils, ou pas, à ce que tu attendais/espérais ?

    PS: cout, ou le débuggeur, sont tes précieux amis.
    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...

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Salut.

    Il est pourtant facile de vérifier les questions que te pose ton prof, non ?

    1- just do it.
    NB: tu as oublié a->fonction1();

    2- just do it

    3- Qu'as-tu essayé de faire pour l'instant et quels sont les résultats ? Pourquoi correspondent-ils, ou pas, à ce que tu attendais/espérais ?

    PS: cout, ou le débuggeur, sont tes précieux amis.
    Sinon, pour répondre à la question et valider tes résultats :

    Question 1
    1/ B (puisque fonction1 dépends du type statique de la classe, vu qu'elle n'est pas virtuelle)
    2/ A (puisque a est un objet de type a)
    3/ B (puisque b est un objet de type b)

    Et pour le cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A *c = new B();
    c->fonction2();
    C'est le type dynamique de l'instance c qui est pris en compte (donc B), et c'est donc l'implémentaion de B qui est utilisée.

    Question 2
    La table des fonctions virtuelles n'est valide qu'une fois le constructeur complètement exécuté. Donc que la fonction appelée soit virtuelle ou non, c'est celle qui correspondont au type statique de l'instance qui sera utilisé.

    Dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    A::A()
    {
      fonction1(); // non virtuelle
      fonction2(); // virtuelle, mais le type n'est pas encore un type dynamique
    }
     
    B::B() : A()
    {
    }
     
    B *b = new B();
    Les fonctions A::fonction1() et A::fonction2() seront appelée. B::fonction2() ne sera pas appelée.

    Question 3
    Pour appeler le constructeur de A, tu n'as rien de spécial à faire : il est appelée systématiquement. Si A possède plusieurs constructeurs, ou si A ne possède pas de constructeur par défaut (ne prenant aucun paramètres), alors tu dois forcer l'appel d'un constructeur spécifique avec la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B::B() : A(paramètres...)
    {
    }
    Le constructeur de A ne connait pas les fonctions de B. Comme dit plus haut, dans le constructeur (ainsi que dans le destructeur), aucune fonction n'est considérée comme virtuelle. Du coup, si tu veux appeler une fonction de B, tu dois le faire depuis le constructeur de B. Fort heureusement, celui-ci ne commence son exécution qu'une fois le constructeur terminé - tu as donc la garantie que l'appel des fonctions de B se fait après l'exécution du constructeur de A.
    [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.

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

    Informations professionnelles :
    Activité : aucun

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

    En fait, je crois que l'objectif de Luc était de laisser Kaluza se débrouiller un peu pour qu'il apprenne, étant donné qu'il "suffit" de lancer le compilateur

    Tu lui a bousillé son effet

    Citation Envoyé par la sagesse populaire
    Donne un poisson à quelqu'un, il mangera un jour
    apprend lui à pêcher, il mangera toujours
    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

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    En fait, je crois que l'objectif de Luc était de laisser Kaluza se débrouiller un peu pour qu'il apprenne, étant donné qu'il "suffit" de lancer le compilateur

    Tu lui a bousillé son effet

    Ah mais en lançant le compilateur, il peut voir l'effet, mais comprendra-t-il les causes ?

    Et je préfère celle là:

    Citation Envoyé par popular wisdom
    Give a man fire and he'll be warm till the end of day.
    Set a man on fire and he'll be warm till the end of his life
    [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.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Certes, mais eut-il fallut qu'il revienne vers nous après observations avec ses hypothèses et ses questions, à lui. Et pas celles de son prof.
    Là, tu as fait le grep qu'il aurait dû faire dans son cours.
    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...

Discussions similaires

  1. [PHP 5.3] Abstract méthode en héritage
    Par Général03 dans le forum Langage
    Réponses: 3
    Dernier message: 21/10/2011, 11h31
  2. Signature de méthode et héritage
    Par rigolocrabe dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2009, 22h17
  3. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  4. [Débutant] Héritage & appel de méthodes
    Par KooX dans le forum Langage
    Réponses: 4
    Dernier message: 11/05/2004, 23h37
  5. [Héritage] Redéfinition méthode
    Par petit-ourson dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2004, 16h06

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