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 :

Héritage : Constructeur classe mère appelle méthode de la classe fille


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 26
    Points
    26
    Par défaut Héritage : Constructeur classe mère appelle méthode de la classe fille
    Bonjour à tous,
    je vais donner le code puisqu'il est très simple :

    Une classe mère, qui contient un constructeur qui appelle une méthode virtuelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A{
    public:
      A(){
        test();
      }
     
      virtual void test(){
        std::cout << "classe A";
      }
    };
    Puis une classe fille qui ne fait que redéfinir la méthode virtuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class B : public A{
    public:
        void test() {
        std::cout << "classe B";
      }
    };
    Le main ne contient que la création d'un objet B, qui provoque l'affichage du message : "classe A".
    Or je voudrais le contraire, vennant de Java j'utilisais souvent ce mécanisme pour éviter de la duplication de code.

    Comment palier à ce résultat?
    Merci à toutes réponses.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne suis pas sûr de comprendre. Car tout simplement:Affichera: "classe B"
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Points : 144
    Points
    144

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Effectivement, sauf que je veux que ce soit fait dans le constructeur de la classe mère.
    C'est une façon de personnaliser le constructeur de la classe B sans pour autant copier-coller celui de la A.

    Exemple :
    - A la base le constructeur de la classe A est complet.
    - Puis je vois que je vais devoir dériver une classe B de A, mais la j'aimerais modifier légèrement le constructeur pour ma classe B [ sans faire un copier-coller de celui de A et modifier la ligne approprié ( car duplication de code ) ]

    Je vais donc isolé la partie que je veux modifier dans une méthode virtuelle.
    Le constructeur de A sera alors général. Dans toutes les classes filles je n'aurais qu'à redéfinir la méthode pour changer quelques petites choses.

    Exemple en code ( ma classe A ) :
    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
     
    class Tableau{
    public:
        Tableau(){
     
             ... pleins d opérations initiales ...
     
             for(...)     
                tableau[...] = creerValeur(...);
        }
     
        virtual int creerValeur(...){
             return ...;
        }
    };
    Ma classe B, qui veut un contenu un peu différent pour son tableau, mais sans modifier les nombreuses opérations initiales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class TableauTrie : public Tableau{
     
       int creerValeur(...){
            return ....;
       }
    };
    Voila c'est tout. Peut-être dois-je utiliser une méthode virtuelle pure?

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    As tu consulté la FAQ à ce sujet ?

    Puis-je appeler des fonctions virtuelles dans le constructeur (ou le destructeur) ?

    De mémoire, il y aura une nouvelle fonctionnalité dans c++0x pour cela (delegating constructors je crois ?)

    Une alternative est de créer une fonction init() ou équivalent qui initialise ton objet en appelant les fonctions virtuelles

    EDIT : suite à ton message
    Par exemple, tu souhaites appeler une fonction creerValeur() dans le constructeur d'un tableau. En terme objet, ça me semble être une approche "étrange"
    On s'attendrait plutôt à ce qu'un tableau (un conteneur en général) ne se remplisse pas tout seul mais lors d'appel de fonctions spécifique (push_back, addQuelqueChose, etc.) ou à défaut se redimensionne avec des valeurs par défaut (resize, addRow, UnConstructeur(int x, inty) càd en remplissant avec des 0, des chaines vides ou en appelant le constructeur par défaut du type contenu)
    Donc le remplir avec des éléments en fonction du type de tableau n'est pas un comportement habituel, non ? (si quelqu'un a des contre-exemples)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Merci à tous, j'ai lu les différents liens et cela ne fonctionne pas comme en java.
    Je retiens donc qu'on n'appelle pas de méthode virtuelle dans le constructeur.

    Je vais utiliser des init().

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    La différence fondamentale entre le C++ et le Java en l'occurrence est que le C++ considère que le constructeur défini comment initialiser l'objet, alors que Java considère qu'il est appelé après une initialisation par défaut de l'objet, pour lui donner des paramètres additionnels.


    A part ça, plutôt qu'un simple init, que l'on risque d'oublier d'appeler, le plus sûr est de faire les appels virtuels dans une factory, dès que l'objet est fini d'être construit. On met alors le constructeur de A en private afin d'éviter de construire l'objet sans passer par la factory.
    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.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Je vois merci pour la précision.

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

Discussions similaires

  1. Méthode classe mère appelle méthode surdéfini de la classe fille
    Par djrilhouse dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/03/2013, 20h24
  2. Réponses: 14
    Dernier message: 06/06/2009, 21h42
  3. Surcharger les méthodes d'une class mère
    Par Djobird dans le forum Langage
    Réponses: 8
    Dernier message: 06/06/2008, 16h54
  4. Réponses: 14
    Dernier message: 17/11/2006, 19h17
  5. [POO]Appelé une méthode d'une classe mère
    Par LE NEINDRE dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2005, 14h44

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