2011-03-01 4 views
9

j'ai une classe simple comme ci-dessousAccès à un membre de la classe de base en classe dérivée

class A { 
     protected: 
     int x; 
     }; 

class B:public A 
     { 
     public: 
     int y; 
     void sety(int d) 
     { 
     y=d; 
     } 
     int gety(){ return y;} 
     }; 

int main() 
{ 
B obj; 
obj.sety(10); 
cout<<obj.gety(); 
getch(); 
} 

Comment puis-je définir la valeur de la variable A::x d'une instance par exemple protected du dérivé class B sans créer une instance de class A .

EDIT: Peut-on accéder à la valeur de A::x en utilisant l'objet de B? Comme obj.x?

+0

Il suffit d'y accéder. Il est visible dans les fonctions membres de B. – Erik

Répondre

9

Best unA, créant ainsi une instance de B crée une instance de A. Cela étant dit, je ne suis pas sûr de ce que votre question réelle est, voici donc un code qui clarifiera Espérons que les choses:

class A 
{ 
protected: 
    int x; 
}; 

class B : public A 
{ 
public: 
    int y; 

    int gety() const { return y; } 
    void sety(int d) { y = d; } 

    int getx() const { return x; } 
    void setx(int d) { x = d; } 
}; 

int main() 
{ 
    B obj; 

    // compiles cleanly because B::sety/gety are public 
    obj.sety(10); 
    std::cout << obj.gety() << '\n'; 

    // compiles cleanly because B::setx/getx are public, even though 
    // they touch A::x which is protected 
    obj.setx(42); 
    std::cout << obj.getx() << '\n'; 

    // compiles cleanly because B::y is public 
    obj.y = 20; 
    std::cout << obj.y << '\n'; 

    // compilation errors because A::x is protected 
    obj.x = 84; 
    std::cout << obj.x << '\n'; 
} 

obj peut accéder A::x comme une instance de A pourrait, parce que obj est implicitement une instance de A.

+0

Peut-être que vous voulez mentionner la portée et comment cela affecte également l'accès. – reuscam

+0

@reuscam, édité pour plus de clarté (heureusement) – ildjarn

0

Vous pouvez simplement référence à simplement comme x dans la classe B

Par exemple:

class B : public A 
{ 
public: 
    ... 

    void setx(int d) 
    { 
     x=d; 
    } 
}; 
1

A::x est protégé, donc pas accessible de l'extérieur, ni comme A().x ou B().x. Il est cependant accessible dans les méthodes A et celles qui en héritent directement (car protégées, pas privées), par ex. B. Donc, indépendamment de la sémantique B::sety() peut y accéder (comme x ou A::x en cas d'ombrage par un B::x ou pour la verbosité pure).

0

Notez que B n'a pas d'accès FULL à A :: x. Elle ne peut accéder à ce membre par une instance d'un B, rien de type A ou provenant de A.

Il existe une solution que vous pouvez mettre dans:

class A 
{ 
    protected: 
    int x; 
    static int& getX(A& a) 
    { 
     return a.x; 
    } 

    static int getX(A const& a) 
    { 
    return a.x; 
    } 
}; 

et maintenant en utilisant getX, une classe dérivé de A (comme B) peut atteindre le membre x de n'importe quelle classe A.

Vous savez également que l'amitié n'est pas transitive ou héritée. La même "solution de contournement" peut être faite pour ces situations en fournissant des fonctions d'accès.

Et dans votre cas, vous pouvez réellement fournir un accès "public" au x via votre B en ayant des fonctions publiques qui y parviennent. Bien sûr, dans la programmation réelle, il est protégé pour une raison et vous ne voulez pas donner tout accès complet, mais vous le pouvez.

+0

Entièrement correct, mais pour un débutant, vous devriez contraster cela avec le comportement de 'private:' – MSalters

Questions connexes