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 :

Appel de méthode protected dans une classe fille


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut Appel de méthode protected dans une classe fille
    Bonjour,

    Je suis devant un problème de d'erreur de compilation que je n'arrive pas à comprendre. Voici le code (simplifié bien sur) :

    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
    #include <iostream>
     
    class A
    {
    public:
        virtual ~A() {}
     
    protected:
        virtual void f() const { std::cout << "Je suis A" << std::endl; }
    };
     
     
    class B : public A
    {
    protected:
        void f() const override { 
            A::f();
            std::cout << "Je suis B" << std::endl;
        }
     
        void fa(const A& a) { a.f(); }
     
    public:
        void call_f() { f(); }
    };
     
    int main()
    {
        B b;
        b.call_f();
        b.fa();
     
        return 0;
    }
    Ce code ne compile pas (avec VS 2005) et l'erreur indique :
    1>.\main.cpp(21) : error C2248: 'A::f' : impossible d'accéder à protected membre déclaré(e) dans la classe 'A'
    La ligne 21 correspond à la ligne void fa(const A& a) { a.f(); }

    Je ne comprends pas pourquoi je ne peux pas appeler une méthode protected d'une instance de la classe A dans une méthode de la classe B alors que B dérive de A. Merci de m'indiquer mon erreur, je sèche...

    Le Mérovingien

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je pense que c'est parce que tu essayer d'accéder à f() comme si c'était une méthode statique avec les "::". Vu que c'est une méthode de classe tu dois d'abord déclaré l'objet associé, ici "A". De plus, tu ne peux pas faire b.fa(); car "fa" est une méthode protected et non public.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Dans le code de B::f, le A::f() compile et fonctionne : ça appelle this->A::f() en fait.

    C'est pour le fa() que ça pose problème : certe f est protected dans A, mais comme B dérive de A, pourquoi ne peut-on pas appeler f sur une instance de A dans une méthode de B ?

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    Dans le code de B::f, le A::f() compile et fonctionne : ça appelle this->A::f() en fait.
    Autant pour moi

    Malgré tout, tu appelles une méthode protected dans ton main() : b.fa();.

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Malgré tout, tu appelles une méthode protected dans ton main() : b.fa();.
    Qui plus est, sans lui fournir les bons paramètres.

    Sinon pour en revenir à l'erreur de compilation : protected donne le droit à une classe dérivée d’accéder aux membres de la classe de base qui fait partie de cette classe dérivée (i.e. ce qui est héritée de la classe de base par la classe dérivée et permet d'appeler this->f()) mais pas d’accéder aux membres d'une autre instance de cette classe. L'instance de la classe A passer en paramètre de fa() n'a aucun rapport avec l'instance de la classe B, celle-ci ne peut donc pas accéder aux membres protected.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Oui en effet, dans le main ça ne risquait pas de marcher , mais comme ça plantait avant je n'ai pas fait attention.

    Merci gl pour ta réponse, je pensais que ce que je voulais faire était autorisé, mais tant pis . Du coup mes possibilités sont soit de rendre A::f publique, soit de déclarer B comme amie de A ? Etant donnée que l'amitié ne s'hérite pas, ce n'est pas terrible pour du polymorphisme. Mais bon, c'est une autre question.

    Merci à vous deux,

    Le Mérovingien

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  2. Réponses: 2
    Dernier message: 18/01/2008, 11h59
  3. Initialisation const dans une classe fille
    Par cyberjoac dans le forum C++
    Réponses: 3
    Dernier message: 07/10/2007, 17h53
  4. méthode add dans une classe héritant de ArrayList
    Par sliderman dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 05/06/2007, 09h27

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