Partage
  • Partager sur Facebook
  • Partager sur Twitter

polymorphisme...

Sujet résolu
    24 juin 2007 à 2:01:22

    bonsoir tout le monde,
    je voudrais un renseignement concernant le polymorphisme.

    J'ai fait une classe "salarie", et une classe "administratif" qui en hérite.
    class salarie
    {
            protected:
                    fiche_salaire fiche;
                    etat_civil etat;
            public:
                    salarie(string n = "", string p = "", string d = "");
                    ~salarie(void);

                    virtual void acquerir(void); // acquisition d'un salarie
                    virtual void afficher(void); // affiche moi-même à l'écran
                    virtual void calcul(void); // calcule la fiche de salaire
                    void modifier_salaire(double s, double d); // modifie la fiche de salaire
                    double salaire(void); //retourne le salaire de moi-même
                   

    };

    #endif

    class administratif : public salarie
    {
            private:
                   
            public:
                    administratif(string n = "", string p = "", string d = "");
                    ~administratif(void);

                    void calcul(double); // calcule la fiche de salaire
                    void acquerir(void);
                    void afficher(void);

    };



    Je peux créer un objet "salarie" de cette facon:

    salarie *s = new administratif();
    s->acquerir();

    dans ce cas la méthode "acquerir()" est bien celle définie dans la classe "administratif" donc le polymorphisme fonctionne.
    Par contre, j'ai créé une collection de "salarie" à l'aide d'une classe "collection générique":

    collection<salarie> c;
    c.ajouter(s);
    salarie *t;
    t = &c[1];
    t->acquerir();


    et là le polymorphisme ne fonctionne plus, la méthode appelée est celle de la classe "salarie", alors que l'élément "1" de la collection est un "administratif".

    D'où ma question: lorsque je créé mon pointeur "salarie *t", il ne reconnait pas "&c[1]" en tant qu'administratif ?
    Comment puis-je faire pour faire fonctionner le polymorphisme ?
    Merci par avance ! :)
    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2007 à 10:27:52

      C'est parce que tu n'a pas utilisé de pointeur: ta collection est une collection de 'salarie'(sans pointeur) donc lorsque tu appèle le méthode acquerir, c'est celle de salarie qui est appelée.
      Un code correct:

      salarie *s = new administratif();
      s->acquerir();
      collection<salarie*> c;
      c.ajouter(s);
      salarie *t;
      t = c[1];
      t->acquerir();
      • Partager sur Facebook
      • Partager sur Twitter
        24 juin 2007 à 11:04:30

        Pour que le polymorphisme fonctionne il faut deux "ingrédients" :

        1) Des méthodes virtuelles (mot clé virtual)

        2) Un pointeur sur l'objet dont on veut faire la résolution dynamique des liens.

        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          24 juin 2007 à 12:52:12

          Hello !!
          Merci à tous les deux ça fonctionne maintenant !! :)
          En fait j'avais essayé de faire collection<salarie*>, mais ça ne fonctionnait pas, je devais mal m'y prendre.

          Merci encore !
          • Partager sur Facebook
          • Partager sur Twitter
            24 juin 2007 à 18:16:50

            Pour info : le polymorphisme marche également avec les références...
            • Partager sur Facebook
            • Partager sur Twitter
              24 juin 2007 à 18:23:16

              Oui çà marche aussi avec les références (heureusement !) mais dans le cas présent la présence d'un conteneur(collection) fais que l'usage d'une référence est probablement impossible à part si le code gère ce cas.
              • Partager sur Facebook
              • Partager sur Twitter
                24 juin 2007 à 18:30:36

                Si c'est possible seulement on met des références dans un conteneur que dans un cas précis, car les références ne sont pas des objets à part entière mais sont associés à un objet alloué quelque part.
                Bref, mon message était juste à titre informatif, pas pour le cas présent.
                Car on pense toujours polymorphisme<=>pointeurs .
                • Partager sur Facebook
                • Partager sur Twitter

                polymorphisme...

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown