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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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