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

Langage C++ Discussion :

Problème de polymorphisme


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Problème de polymorphisme
    Hello,

    Soit une classe Parent, et deux classes qui en sont dérivées :

    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 Parent
    {
        void process() { display(); }
        virtual void display() { cout << "Je suis un parent." << endl;
    };
     
    class Child : public Parent
    {
        virtual void display() { cout << "Je suis un enfant." << endl;
    };
     
    Parent myParent;
    Child myChild;
     
    myChild.process();
    m'affiche : "Je suis un parent."

    Alors que je voudrais évidemment : "Je suis un enfant."

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    je teste ton code et il m'affiche bien "Je suis un enfant."
    de plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Parent * p = &myChild;
    p->process();
    M'affiche aussi "Je suis un enfant."

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 551
    Par défaut
    Bonjour,

    à partir du moment ou display est déclarée virtual la version appelée dépendera bien du type réel de l'instance et non du type statique.

    peut être avez-vous eu une version de la classe Parent sans virtual et que suite à la modification tout n'a pas été recompilé (process étant défini sur Parent appelant donc display également sur Parent) ?

    recompilez donc tout et réessayez

    P.S. il manque une } dans chacune des classes, mais je suppose que c'est juste un problème de copier-coller
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En fait, j'ai créé un code simple, à partir de classes beaucoup plus compliquées.
    Avec lesquelles cela ne fonctionne pas. Je pensais que peut-être, il n'était pas possible d'appeler une fonction redéfinie polymorphiquement à partir d'un appel situé dans la classe de base.

    Apparemment si, d'après vos réponse.

    Je vais revoir mon code...

    Merci. Je vous tiens au courant.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une erreur classique est d'affecter un type dérivé dans un type de base en pensant qu'on va maintenir le type dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Parent myParent;
        Child myChild;
        myParent = myChild;
        myParent.process(); // marche pas !
    C'est pour ça qu'en général, les classes servant à un héritage publique n'ont pas de sématique de copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Parent
    {
        private:
        Parent(Parent const&);
        Parent&operator=(Parent);
    };
    Une autre piste peut être à un static_cast faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Parent myParent;
        Parent &rParent = myParent;
     
        Child &rChild = static_cast<Child&>(rParent);
        rChild.process(); // erreur
    C'est pour ça qu'il faut (au mieux ne pas faire de downcast sinon) utiliser les dynamic_cast qui génère une exception pour les références ou retourne un pointeur nul pour les pointeurs :
    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
        Parent myParent;
        Parent &rParent = myParent;
     
        try{
            Child &rChild = dynamic_cast<Child&>(rParent);
            rChild.process();
        }
        catch(std::exception const &e)
        {
            std::cout<<e.what()<<"\n";
        }
     
     
        Parent * pParent = &myParent;
        Child *pChild = dynamic_cast<Child*>(pParent);
        if(pChild){
            pChild->process();
        }
        else{
            std::cout<<"invalid cast\n";
        }

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je pense que mon problème est lié au premier cas.

    Le problème est que je ne connais pas le type réél, puisque je me trouve dans le process() de la classe de base.

    Peut-être que ce que je veux faire n'est pas résolvable par le langage, mais par un design pattern quelconque...

    Dans le même esprit, j'ai un autre problème que je vais soumettre dans un autre fil.

Discussions similaires

  1. Problème de polymorphisme ou de conception
    Par LinuxUser dans le forum C++
    Réponses: 16
    Dernier message: 11/12/2012, 13h07
  2. [Débutant] [POO]Problème de polymorphisme avec la méthode ToString()
    Par vmolines dans le forum C#
    Réponses: 5
    Dernier message: 08/02/2012, 00h19
  3. Problème de polymorphisme
    Par twixnoir dans le forum Langage
    Réponses: 5
    Dernier message: 06/06/2011, 23h16
  4. Réponses: 11
    Dernier message: 14/06/2010, 13h26
  5. Problème de polymorphisme
    Par Alain Defrance dans le forum C++
    Réponses: 6
    Dernier message: 14/03/2008, 17h03

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