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 :

Virtual et le polymorphisme


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut Virtual et le polymorphisme
    Bonsoir,

    Je programme en JAVA depuis quelques temps et je me suis mis au C++ pour mon travail, et je but sur un petit soucis concernant le polymorphisme.

    J'ai écrit un petit code que voici :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <iostream>
     
    using namespace std;
     
     
    class Mere
    {
     
        public :
     
            virtual void AfficheNom(void);
    };
     
    void Mere::AfficheNom(void)
    {
        cout << "Je suis la mere" << endl;
    }
     
    class Fille : public Mere
    {
        public:
     
            void AfficheNom(void);
    };
     
    void Fille::AfficheNom(void)
    {
        cout << "Je suis la fille" << endl;
    }
     
    int main()
    {
     
        Mere tableauDeMere[3];
        Mere mere1;
        Mere mere2;
        Fille fille;
     
        tableauDeMere[0] = mere1;
        tableauDeMere[1] = fille;
        tableauDeMere[2] = mere2;
     
        for ( int i = 0; i < 3; i++ )
            tableauDeMere[i].AfficheNom();
     
     
        return 0;
    }
    Lors de l'exécution, j'obtiens 3 fois "Je suis la mere".

    Je pensais que l'attribut virtual permettait justement d'appeler la fonction redéfinie dans la classe fille dans ce genre de cas.
    En JAVA, ce code donnerait le résultat suivant :
    Je suis la mere
    Je suis la fille
    Je suis la mere

    Y'a-t-il quelque chose que j'ai mal compris ?

    Si oui, merci de m'éclairer :-)

    Cdt,

    Yann.

  2. #2
    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
    En C++, il faut utiliser soit des références soit des pointeurs vers la classe mère pour bénéficier du polymorphisme.
    En Java, la VM se charge de gérer le polymorphisme.

    Ici, tu as besoin de créer un tableau de pointeurs vers Mere, et appeler les fonctions dans la boucle de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableauDeMere[i]->AfficheNom();

  3. #3
    screetch
    Invité(e)
    Par défaut
    Ici tu a copié dans un tableau de "Mere" une "Fille". Je ne sais pas precisement le resultat de cela mais je pense que le compilateur a deduit un moyen de construire une Mere a partir de la Fille, et tu te retrouves avec des Meres dans ton tableau. En effet la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableauDeMere[0] = mere1;
    realise une COPIE de mere et la place dans le tableau.


    Pour que le virtuel fonctionne il faut passer par un pointeur sur l'objet et pas par l'objet lui meme :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <iostream>
     
    using namespace std;
     
     
    class Mere
    {
     
        public :
     
            virtual void AfficheNom(void);
    };
     
    void Mere::AfficheNom(void)
    {
        cout << "Je suis la mere" << endl;
    }
     
    class Fille : public Mere
    {
        public:
     
            void AfficheNom(void);
    };
     
    void Fille::AfficheNom(void)
    {
        cout << "Je suis la fille" << endl;
    }
     
    int main()
    {
        //un tableau de Mere*
        Mere* tableauDeMere[3];
        Mere mere1;
        Mere mere2;
        Fille fille;
     
        // place les adresses dans le tableau
        tableauDeMere[0] = &mere1;
        tableauDeMere[1] = &fille;
        tableauDeMere[2] = &mere2;
     
        for ( int i = 0; i < 3; i++ )
            tableauDeMere[i]->AfficheNom();
        //cette fois ci ca marche!
     
     
        return 0;
    }

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Bonsoir,

    Le polymorphisme en C++ ne s'applique que pour les membres auxquels on accède par référence ou par pointeur. Là tu y accèdes par valeur, donc c'est la méthode du type de cette valeur qui est appelée (autrement dit la méthode de la classe Mère).

    le programme suivant devrait t'en convraincre :

    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
    18
    19
    20
    21
    22
    23
     
    int main(int argc, char* argv[])
    {
       Mere* tabmere[3];
       Mere* mere1 = new Mere;
       Fille* fille = new Fille;
       Mere* mere2 = new Mere;
     
       tabmere[0] = mere1;
       tabmere[1] = fille;
       tabmere[2] = mere2;
     
       for(int i=0; i<3; i++)
       {
          tabmere[i]->AfficheNom();
       }
     
       delete mere1;
       delete fille;
       delete mere2;
     
       return 0;
    }
    EDIT : multi grilled

  5. #5
    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
    (Petit PS : en C++, il vaut mieux déclarer systématiquement le destructeur d'une classe mère virtuel, pour une bonne libération des ressources ... cf n'importe quel cours de C++, chapitre classes et héritage)

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Citation Envoyé par Alp Voir le message
    En Java, la VM se charge de gérer le polymorphisme.
    J'aurais plutôt dit qu'en Java tout est pointeur, et que cela marche pareil en C++ à partir du moment où tu utilises des pointeurs.
    La différence est que le C++ propose aussi de manipuler des valeurs, et c'est là ce qui est fait. D'où les erreurs.
    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...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Merci à tous pour vos réponses rapides et claires !

    Effectivement j'avais complètement omis le fait qu'il fallait utiliser des pointeurs ou des références pour que le polymorphisme puisse s'appliquer.

    En effet en Java c'est automatique, la VM s'occupant de déterminer le type exacte de l'objet directement à l'exécution...

    Merci encore,

    Yann.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Non. Aucun rapport avec la présence d'une VM. Si Java permettait des objets manipulés autrement que par entité (=> pointeur) tu aurais pu avoir exactement le même problème;
    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. Double polymorphisme? (virtual)
    Par SuperAldoIsDead dans le forum C++
    Réponses: 5
    Dernier message: 13/11/2006, 16h36
  2. Réponses: 36
    Dernier message: 09/09/2006, 03h06
  3. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58
  4. Virtual-key code
    Par lyrau dans le forum Windows
    Réponses: 2
    Dernier message: 29/03/2003, 19h22
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50

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