2017-11-04 3 views
0

public을 상속 한 파생 클래스의 메서드에서 기본 클래스의 보호 된 멤버에 액세스하려고하면 오류가 발생합니다.공개 파생 클래스의 보호 된 멤버에 액세스

기본 클래스의 참조 두 객체를 파생 클래스의 메서드에 전달하고 해당 개체의 보호 된 멤버에 액세스하려고합니다. 그러나 편집자는 불평합니다.

int A::x 
protected member A::x (declared at line 5) is not accessible though "A" pointer or object. 

내 코드에 어떤 문제가 내가 무엇을 할 수 :

class A { 
protected: 
    int x; 
}; 

class B:public A 
{ 
public: 
    void test(A &obj1, A &obj2) 
    { 
    obj1.x = 1; 
    obj2.x = 2; 
    } 
}; 

그리고 this을 편집기에서 불평한다 : 종류에

, 여기에 내가 뭘하려고 오전입니다 그것을 정정하는 것?

감사합니다.

+0

복사 및 붙여 넣기 오류하시기 바랍니다 메시지를 그들에게 외부 링크를 클릭하거나 이미지를 사용하지 마십시오 : 클래스 B에있는 X를 액세스하기위한 다음과 같은

그래서, 전체 코드를 작성할 수 있습니다. 컴파일을 시도하면 컴파일러에서 동일한 메시지를 제공 할 가능성이 높습니다.이 메시지는 복사하기가 더 쉽습니다. – aschepler

+0

배지가 부족하기 때문에 이미지를 업로드 할 수 없습니다. 대신 오류가 작성된 링크가 자동으로 작성되었습니다. – ginos

+1

'x'는'B' 객체에 접근 할 수 있지만'A' 객체는 접근 할 수 없습니다. – DimChtz

답변

1

파생 된 개체와 동일한 유형의 클래스의 기본 클래스로 보호 된 멤버에만 액세스 할 수 있습니다. 구성원이나 다른 해결 방법을 얻으려면 공개 방법을 만들어야합니다. A를 개인으로 상속받은 다른 클래스 C가 있다고 상상해보십시오. C 참조를 B 참조로 전달할 수 있지만 기본 클래스 멤버는 액세스 할 수 없습니다. 참조가 B가 참조하는 B 메소드로 전달되면 그 안에있는 보호 된 멤버에 액세스 할 수 있습니다.

+1

액세스는 특별히 'this'를 통과 할 필요는 없지만 반드시 필요합니다. 파생 된 유형의 객체를 통해. – aschepler

+0

고맙습니다. 고마워요. –

0

클래스 A의 경우 변수 x가 보호되어 클래스 A의 비공개처럼 작동하므로 멤버 변수 A :: X에 액세스 할 수 없습니다. 당신이

void test(B &obj1, B &obj2) 

에 방법

void test(A &obj1, A &obj2) 

을 변경하면 상속이 공개로 보호로

그러나, 그럼 당신은 가능한 것으로, 클래스 B의 변수 x에 액세스 할 수 있습니다.

class A { 
    protected: 
     int x; 
}; 

class B:public A 
{ 
    public: 
     void test(B &obj1, B &obj2) 
     { 
      obj1.x = 1; 
      obj2.x = 2; 
     } 
}; 
관련 문제