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++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 11
    Par défaut Problème de polymorphisme
    Bonjour !

    Faisons court, faisons simple : J'aurais voulu faire quelque chose comme ceci :

    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
    // partie API
     
    class A {
    };
    class B : public A {
          public:
                void doFunc () { cout << "bla" << endl; }
    };
     
    // partie Programmeur
     
    void func (A& var) {
          var.doFunc();
    }
     
    int main () {
          /* ici pour test, en fait func est appelée par la partie API via un pointeur de fonction. */
          B var;
          func(var);
    }
    Pour que ce code compile je pourrais écrire le prototype de doFunc en virtual dans A. Mais ça, je ne le peux pas. En effet mes contraintes sont les suivantes:
    - La classe de base A ne peut pas connaître le contenu des classes filles comme B.
    - la signature de la fonction func doit être unique.

    Un reinterpret_cast<B&>(e) est possible mais ce serait plutôt mal pratique à mon goût (puisque dans la partie Programmeur), je voudrais que la conversion soit transparente à l'utilisateur.

    Et je travaille en C++2011

    Je trouve dommage que le polymorphisme se limite aux méthodes qui sont déclarées dans le parent, à vrai dire je trouve ça tellement limité que je me demande s'il y a anguille sous roche ?

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Comment ton code doit se comporter si l'objet passé en paramètre est en réalité un A et pas un B ? A l'heure actuelle il y a un gros porblème car la fonction doFunc n'existe pas pour un A.

    Le but du polymorphisme c'est d'avoir des comportements différents entre les différents objets d'une même hiérarchie, il faut néanmoins que tous les objets puissent recevoir le message, sinon ca n'a pas de sens.

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

    Informations professionnelles :
    Activité : aucun

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

    J'ai l'impression que tu te mérpends sur le sens qu'il faut donner à la virtualité des fonctions.

    Lorsque l'on décide de rendre une fonction virtuelle, on envoie à l'utilisateur un message du genre de:
    Je sais que la classe que je vous présente risque d'être dérivée.

    Je ne peux déterminer que le comportement qui sera intéressant pour la classe mère

    Vous pouvez donc décider d'adapter ce comportement, si vous considérez qu'il ne correspond pas à vos besoins pour les classes dérivées
    Cela te permet donc, justement, d'autoriser l'appel de la fonction pour n'importe quel type "passant pour être" du type de la classe mère (comprends: pour n'importe quel type dérivé publiquement de la classe mère ) en assurant un comportement adapté à la classe mère, et sans qu'il ne faille prendre en compte les éventuelles classes dérivées (qui adapteront le comportement de la fonctions à leur propre réalité en cas de besoin)
    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

  4. #4
    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
    Bonjour,

    Citation Envoyé par twixnoir Voir le message
    Je trouve dommage que le polymorphisme se limite aux méthodes qui sont déclarées dans le parent, à vrai dire je trouve ça tellement limité que je me demande s'il y a anguille sous roche ?
    Le C++ a fait le choix d'avoir les fonctions virtuelles dans la classe et pas en dehors. (c'est au passage le choix partagé avec d'autres langages). Mais c'est peu lié à ton problème. Car, comme le souligne Flob90, pour que ton expression soit polymorphe (F.A.Q. : Qu'est ce que le polymorphisme), elle doit rester valide que l'objet soit de type B ou de type A. Sinon, elle ne l'est plus.

    Peut être n'as-tu pas besoin d'un polymorphisme d'inclusion.

    Difficile de donner une piste si on ne connait pas le besoin derrière. Cela donne plutôt l'impression que la solution vers laquelle tu t'orientes est trop tarabiscotée par rapport au problème à résoudre. Il existe certainement une solution ... encore faudrait-il connaître le problème...

  5. #5
    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 : 50
    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
    Par défaut
    Je suis d'accord avec 3DArchi : Tu n'expose pas ton problème, mais une partie de solution qui ne marche pas. Ça ne nous donne pas assez d'information pour te proposer une alternative viable.

    3DArchi semble suggèrer une solution à base de template et de duck-typing. Une solution dans une voie totalement opposée serait que A contienne une map<string, "pointeur de fonction qui va bien">, remplie dans le constructeur de B, et que l'on résolve tout dynamiquement à l'exécution.
    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.

  6. #6
    screetch
    Invité(e)
    Par défaut
    Peut etre le problème est que A ne sait pas faire un doFunc mais que B sait le faire.
    Mais même si A ne sait pas le faire, il est possible de dire au compilateur que toutes les sous-classes de A peuvent faire doFunc en declarant une fonction virtuelle pure.

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. Réponses: 11
    Dernier message: 14/06/2010, 13h26
  4. Problème de polymorphisme
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 22/05/2010, 07h53
  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