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 :

Héritage et protected


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par défaut Héritage et protected
    Bonjour,

    J'ai une classe A qui contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    protected: 
      vector<Point*> *vCp;
    et une classe B dérivée de A. Pour construite B à partir d'une instance de aA de A, je dois accéder à ces points (d'où le "protected"). Mais lorsque j'écris "(aA->vCp)->at(i)" dans le constructeur B::B(A aA), j'obtiens l'erreur : "*vCP is protected within this context."

    Quelle est l'erreur que je fais ?
    En vous remerciant par avance.
    Christian

  2. #2
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Tu ne peux pas accéder aux membres protected d'une classe mère, c'est comme ça. Seul la classe déclarant les attributs protected peut y accéder directement.

    Par contre, ce que tu peux faire, c'est ça:

    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 A
    {
    protected:
    	vCp_t* aA;
    };
     
    class B : public A
    {
    public:
    	B( const A& a ) :
    		A( a )
    	{
    		//aA->vCp->at(i); accessible, puisque ça nous appartient
    	}
    };

  3. #3
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Tu ne peux pas accéder aux membres protected d'une classe mère, c'est comme ça.
    heu... je ne comprends pas bien ce que tu veux dire par là...

    Mais je subodore un oubli classique qui est peut être la cause du problème de coberle : la déclaration publique de l'héritage.
    Voici un exemple de code qui ne compile pas :
    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
    class A
        {
        protected:
            int x ;
        };
     
    class B : A
        {
        public:
            void foo ()   { x = 9 ;}
        };
     
    class C : B
        {
        public:
            void bar ()   { x = 10 ;}   // erreur !
        };
    La classe C n'a pas accès à x car ce dernier est devenu privé au moment où B hérite de A.
    Il faut écrire ça :Ici le mot clef public signifie que les membres publiques, protégés et privés de A seront respectivement publiques, protégés et privés dans B.
    L'héritage étant privé par défaut, les héritiers de B ne peuvent accéder à aucun membre de A.

    Hum... suis-je clair ?

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par sopsag Voir le message
    heu... je ne comprends pas bien ce que tu veux dire par là...
    Ce que je veux dire, c'est que tu ne peux pas accéder directement à la partie protégée d'une autre classe, même si tu en dérives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A
    {
    protected:
    	int as;
    };
     
    class B : public A
    {
    public:
    	B( const A& a )
    	{
    		as = a.as; // erreur;
    	}
    };
    Lors d'un héritage, on passe par l'initialisateur de la classe de base afin de pouvoir utiliser nos propres méthodes pour configurer notre classe.

    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
     
    class A
    {
    protected:
    	int as;
    };
     
    class B : public A
    {
    public:
    	B( const A& a ) :
    		A( a )
    	{
    		// tant que le constructeur par copie de A est correct,
    		// "notre" attribut "as" devrait ici être initialisé et le même que celui de a.
    		belowOne = as < 1;
     
    		// et non comme le posteur original tentait de faire:
    		belowOne = a.as < 1; // erreur
    	}
     
    	bool belowOne;
    };

  5. #5
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Ok, j'ai compris ce que tu voulais dire.
    Parce que hors contexte la phrase "Tu ne peux pas accéder aux membres protected d'une classe mère, c'est comme ça." est un peu ambigüe...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par défaut Je pense avoir compris
    La réponse de Julien ne m'a pas parue évidente du premier coup alors j'ai continuer à écumer le web pour comprendre ... et je pense avoir compris. Si la classe B hérite de la classe A, elle pourra manipuler les éléments "protected" de la classe A (elle en hérite). Mais B ne peut pas accéder/manipuler les éléments d'une instance de A.
    Dans mon cas, j'ai créé un accesseur me permettant d'accéder à l'élément de l'instance ...
    Encore merci pour vos réponses.
    Christian

Discussions similaires

  1. [POO] Héritage et visibilité des attributs : pas de "protected" en JS ?
    Par Hervé Saladin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2007, 15h44
  2. Héritage : private/public/protected
    Par le Daoud dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2007, 13h47
  3. Réponses: 16
    Dernier message: 17/03/2007, 17h31
  4. Visibilité protected et héritage
    Par Satch dans le forum Langage
    Réponses: 20
    Dernier message: 18/01/2006, 11h12
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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