2011-03-01 10 views
9

다음과 같은 간단한 클래스가 있습니다.파생 클래스에서 기본 클래스 멤버에 액세스

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(); 
} 
protected
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(); 
} 

class A의 인스턴스를 만들지 않고 파생 class B의 인스턴스에서 protected 인스턴스 변수 A::x의 값을 설정하는 방법은 무엇입니까?

편집 : B의 ​​개체를 사용하여 A::x 값에 액세스 할 수 있습니까? obj.x처럼?

+0

그냥 액세스하십시오. B의 멤버 함수 내에서 볼 수 있습니다. – Erik

답변

9

B그렇게 A의 인스턴스를 만드는 B의 인스턴스를 생성,A입니다. obj 암시 인스턴스이기 때문에,

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 그냥 A이 수의 인스턴스로 A::x에 액세스 할 수 있습니다 : 그것은이 내가 실제 문제가 무엇인지 잘 모르겠어요 말했다되고, 그래서 여기에 희망 일을 명확하게 몇 가지 코드입니다 A입니다.

+0

범위에 대해 언급하고 액세스가 어떻게 영향을 미치는지에 대해 언급하고 싶을 수도 있습니다. – reuscam

+0

@reuscam, 명확성을 위해 편집 됨 (희망에 따라) – ildjarn

0

당신은 예를 들어, 클래스 B

단순히 x로 참조 할 수 있습니다

class B : public A 
{ 
public: 
    ... 

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

A::x은 외부에서 접근 할 수 없으므로 A().x 또는 B().x이 아닙니다. 그러나 A의 메소드와 직접 상속하는 메소드 (예 : protected가 아닌 private)로 액세스 할 수 있습니다. B. 따라서 의미에 관계없이 B::sety()에 액세스 할 수 있습니다 (B::x으로 섀도 ​​잉하는 경우에는 x 또는 A::x으로 표시하거나 순수하게 자세한 정보를 표시 할 수 있음).

0

B는 A :: x에 대한 전체 액세스 권한이 없습니다.

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

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

지금 getX, 클래스를 사용 : 그것은 단지 거기에 당신이 넣을 수 있습니다 해결 방법 인 B가 아니라 A 형의 무엇이든 또는 A.

에서 파생의 인스턴스를 통해 해당 멤버에 액세스 할 수 있습니다 A에서 파생 된 (B와 같은) A 클래스의 x 멤버에게 접근 할 수 있습니다.

또한 우정은 전이 적이 지거나 상속되지 않는다는 것을 알고 있습니다. 이러한 "해결 방법"은 액세스 기능을 제공하여 이러한 상황을 만들 수 있습니다.

그리고 실제로 공공 기능을 사용하여 B를 통해 x에 "공용"액세스를 제공 할 수 있습니다. 물론 실제 프로그래밍에서는 이유 때문에 보호되므로 모든 것을 모든 권한을 부여하고 싶지는 않지만 할 수는 있습니다.

+0

완전히 맞습니다. 그러나 초보자에게는 이것을'private :'의 행동과 대조해야합니다. – MSalters

관련 문제