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 :

Accès "protected" interdit


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    Par défaut Accès "protected" interdit
    Bonjour,

    voici le code qui me pose problème :

    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
    #include <iostream>
     
    class A
    {
    protected:
      void f() { std::cout << "pourtant" << std::endl; }
     
    }; // class A
     
    class B : public A
    {
    public:
      void g( A& a ) const { a.f(); }
    }; // class B
     
    int main()
    {
      B b;
     
      b.g();
     
      return 0;
    } // main()
    Le message d'erreur que j'ai à la compilation est
    test.cpp: In member function `void B::g(A&) const':
    test.cpp:6: erreur: « void A::f() » est protégé
    test.cpp:13: erreur: à l'intérieur du contexte
    Je ne comprend pas pourquoi B ne peux appeler une méthode protégée de A alors que B hérite de A. Je croyais que "protected" servait justement à ce que les classes filles puissent avoir accès à ces membres. Quelqu'un pourrait-il m'expliquer ?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    1/ L'appel de la fonction g() ne correspond pas à son prototype
    2/ Si la méthode g() est déclarée constante, f() doit être elle aussi constante
    3/ Tu essayes d'accéder à la méthode f() pour un objet de la classe A, pas de la classe B, donc c'est normal que ce soit interdit.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par programan
    1/ L'appel de la fonction g() ne correspond pas à son prototype
    en effet, c'est juste un petit oubli, mais le problème est le même

    Citation Envoyé par programan
    2/ Si la méthode g() est déclarée constante, f() doit être elle aussi constante
    f est appelée sur "a", qui n'a pas de lien avec "b" ; donc il ne devrait pas y avoir de problème

    Citation Envoyé par programan
    3/ Tu essayes d'accéder à la méthode f() pour un objet de la classe A, pas de la classe B, donc c'est normal que ce soit interdit.
    Aïe, je crois que je commence à comprendre... En fait "protected" permet l'accès de ces membres aux classes filles, mais pas entre instances ? C'est a dire que B peut appeler A::f() uniquement pour son instance ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    La classe B hérite de toutes les méthodes de la classe A, et peut utiliser, A SON PROPRE COMPTE, toutes celles qui sont publiques ou protégées. Tu peux donc appeler f() au sein d'une des méthodes de la classe B, mais PAS pour un objet de la classe A, car pour celui-ci cette méthode reste protégée.

    Si tu veux que ta méthode fonctionne tel quel, il faut déclarer la classe B comme amie de A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A 
    { 
    protected: 
      void f()  { std::cout << "pourtant" << std::endl; } 
      friend class B;   // Maintenant, B peut utiliser les méthodes de A pour un objet de type A
    }; // class A 
     
    class B : public A 
    { 
    public: 
      void g( A & a ) const { a.f(); }
    ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    Par défaut
    ok merci

  6. #6
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    C'est normal.

    Dans ton code l'objet a ne peut pas accéder à une méthode protected.

    Tu as mal compris la portée de l'héritage.

    Les fonctions protected sont uniquement accessibles dans l'instance de B.

    Une variable de type A ne peut pas acceder à sse méthodes protected.
    Ceci par contre est possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void g( ) const { f(); }

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

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