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 :

Problème avec le polymorphisme


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut Problème avec le polymorphisme
    Bonjour,

    Après quelques recherches infructueuses sur le forum, je vous pose mon problème.

    Voila, j'ai deux classes mères indépendantes que j'appelrais M et N, et des classes filles m1, m2, n1 et n2 heritant de M ou N.
    Dans les classes m1 et m2, je déclare un attribut n1 dans m1 et n2 dans m2.
    Jusque là aucune difficulté. Mais voila, ailleurs dans mon code, je gère une liste de M* pour y stocker indefferement des m1* ou m2*. Là ou est le problème, c'est que je voudrais pouvoir acceder de maniere transparente a mes attributs n1 ou n2 ( qui heritent de N ), mais je n'y arrivent pas puisqu'ils sont differents.
    Y aurait il une solution plus élégante que de passer par une méthode virtual dans la classe M retournant un void ( genre void* getN() = 0 ) ?

    J''espère que j'ai été assez explicite.

    Merci.

  2. #2
    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
    Salut,

    Il te suffit de retourner un N* ou N&.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Effectivement, j'avais declarer des attributs n1 et n2 dans mes classes filles, alors qu'il fallait declarer un N* dans ma classe M. Et là, plus de problème ( y a des jours où on passe à coté d'évidences , c'est effrayant ).

    Je te remercie pour la reponse rapide.

  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
    Pas forcément. Tu peux très bien avoir besoin du type exact de n dans tes classes m, et vouloir pourtant retourner un type N aux classes clientes. Donc une autre solutinoserait :

    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
     
    class M {
        public:
            virtual N* getN() =0;
    };
     
    class M1 {
        public:
            virtual N* getN() {
                return n;
            }
     
        protected:
            N1* n;
    };
     
     
     
    class M2 {
        public:
            virtual N* getN() {
                return n;
            }
     
        protected:
            N2* n;
    };
    Pense au tag :p

  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
    Citation Envoyé par bolhrak
    Pas forcément. Tu peux très bien avoir besoin du type exact de n dans tes classes m, et vouloir pourtant retourner un type N aux classes clientes. Donc une autre solutinoserait
    Tu peux aussi avoir besoin du type exact de n pour les clients qui connaissent directement M1, et non pas par l'intermédiaire de son interface M. Il est donc plus générique d'écrire :

    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 M {
        public:
            virtual N* getN() =0;
    };
     
    class M1 {
        public:
            virtual N1* getN() {
                return n;
            }
     
        protected:
            N1* n;
    };
    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
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    @JolyLoic
    C'est ce que j'avais fait au début, mais à la compilation j'avais une erreur comme quoi le type de retour de la fonction virtuelle de substitution diffère, mais c'est vrai que cette solution m'aurai arranger, enfin surtout m'aurait éviter d'avoir à caster mes variables quand j'utilise des méthodes de N1 non héritées de N.

  7. #7
    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
    Citation Envoyé par Vitis_Alba
    @JolyLoic
    C'est ce que j'avais fait au début, mais à la compilation j'avais une erreur comme quoi le type de retour de la fonction virtuelle de substitution diffère
    Normalement tu as le droit d'avoir des types de retour différents si le type de retour dans ta méthode redéfinie est un type dérivé du type de retour de ta méthode dans la classe mère. Fais une recherche sur la covariance pour plus de précisions.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Ok, c'est moi qui fautait, en remplaçant mes déclarations anticipées de Nn par des includes, ça va mieux.

    Merci pour l'aide.

  9. #9
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Désolé d'être un peu relou, mais du coup j'ai un problème avec les Set().
    Comment je peux definir mes méthodes Set(N*) sans me faire jeter par le compilo ?

  10. #10
    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
    Citation Envoyé par Vitis_Alba
    Désolé d'être un peu relou, mais du coup j'ai un problème avec les Set().
    Comment je peux definir mes méthodes Set(N*) sans me faire jeter par le compilo ?
    Il te jette à quel endroit du code ? Pour quelle raison ?

  11. #11
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Dans mes classes M1, M2, ..., je voudrais pouvoir avoir une methode Set(N*) pour modifier mon attribut N1 (par exemple). Mais je ne peux pas convertir un N* en N1*, et je ne que la definir comme ça dans ma classe M.

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Vitis_Alba
    Mais je ne peux pas convertir un N* en N1*
    Pourquoi?

  13. #13
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Ah si, en castant, désolé.

  14. #14
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    De preference un dynamic_cast et en verifiant que le resultat n'est pas NULL.

  15. #15
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    oui, chef

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

Discussions similaires

  1. Problème avec le polymorphisme
    Par harf18 dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 03/02/2014, 15h48
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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