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 :

méthode virtuelle pure et héritage


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut méthode virtuelle pure et héritage
    Bonsoir,
    Je me penche sur une question à laquelle je narrive pas à trouver de réponse dans les différents cours/FAQ sur le net.
    j'ai une classe abstraite A et sa dérrivée B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A
    {
     public:
      A& add(const A&) =0;
    };
     
    class B: public A
    {
     public:
      B& add(const A&);
    };
    A priori B::add n'a pas la même signature que A::add, donc pas de raison pour que le compilateur me l'accepte comme surcharge de A::add. Yatil donc un moyen pour que le compilateur me l'accepte quandmeme?

    Accepteratil B& add(const B&); ?

    Les exemples sur le net sont tous des fonctions void fonction(); donc là pas de problème.

    Dans mon cas, il s'agit de surcharger l'opérateur += et -= d'une classe

  2. #2
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Le type de retour est différent, mais pas tant que ça... Tu es dans un cas qu'on appelle "covariant return type", et donc tu as bien redéfini la fonction de la classe de base (certains compilateurs ont un peu de mal avec cette règle).
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ce qu'il faudrait surtout, c'est déclarer A::add comme étant une fonction virtuelle (car, en effet, le seul " = 0" à la fin de la déclaration ne suffit pas pour rendre une fonction "virtuelle pure" )

    Une fois cette précaution prise, tu pourra utiliser le retour covariant avec beaucoup plus de facilités

    Fait cependant attention au fait que les opérateurs ne peuvent pas être virtuels... (et ne peuvent donc a fortiori pas être virtuels purs)

    Il est donc utile de se poser en priorité la question si les opérateur += et -= seront généralement utilisés dans un cadre polymorphe (où tes classes dérivées se font généralement passer pour des classes de bases) ou non.

    Si c'est le cas, il faudra utiliser l'idiome que l'on appelle NVI (Non Virtual Interface, ou, si tu préfères en francais Interface non virtuelle), qui serait proche, dans ton cas, de:
    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
    class A
    {
        public:
            A& operator+=()(A const & a)
            {
                return add(a);
            }
            A& operator-=()(A const & a)
            {
                 return substract(a);
            }
        private: 
            /* les fonctions sont déclarées en privées, car cela passe 
             * bien avec le NVI, à toi de voir si tu veux les exposer ou non
             * (mais c'est a priori inutile ;))
             */
            virtual A& add(A const & ) = 0;
            virtual A& add(A const & ) = 0;
    };
    class B : public A
    {
        private: 
            /* les fonctions sont déclarées en privées, car cela passe 
             * bien avec le NVI, à toi de voir si tu veux les exposer ou non
             * (mais c'est a priori inutile ;))
             *
             * veille juste à ne pas les exposer si tu les laisse privées dans A ;)
             * 
             * Elles doivent être implémentées pour que B puisse devenir une
             * classe concrète ;)
             */
            virtual B& add(A const & );
            virtual B& add(A const & );
     
    };
    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
    Invité
    Invité(e)
    Par défaut
    oh cool, merci
    ça met un nom sur ce que je cherchait: covarient return types
    En effet la solution sera d'implémenter une non virtual interface.
    Bonne soirée

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/10/2012, 19h25
  2. Réponses: 3
    Dernier message: 17/09/2008, 13h52
  3. Réponses: 15
    Dernier message: 05/07/2007, 01h29
  4. Réponses: 23
    Dernier message: 16/03/2007, 20h21
  5. Problème avec une méthode virtuelle pure
    Par Burckel dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2006, 13h00

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