2017-11-27 21 views
10

저는 C++을 배우고 있습니다. 문서 docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp는 말한다 :private로 지정된 기본 클래스의 public static 멤버에 액세스

당신이 비공개로 기본 클래스를 지정하면, 그것은 단지 비 정적 멤버에 영향을 미칩니다. 파생 클래스에서 공용 정적 멤버에 계속 액세스 할 수 있습니다. 그러나

, 이전 인용 원인 오류 C2247 다음 약간의 예에서 조정 한 다음 코드를

'자료 : y'를 액세스 할 수 없습니다 때문에 'Derived1'사용 '에서 상속 할'개인 ' 베이스'.

이 상황에 도움을 주셔서 감사합니다.

class Base 
{ 
public: 
    int x;    
    static int y;  
}; 

class Derived1 : private Base 
{ 
}; 

class Derived2 : public Derived1 
{ 
public: 
    int ShowCount();  
}; 

int Derived2::ShowCount() 
{ 
    int cCount = Base::y;  
    return cCount; 
} 
+2

범위를 올바르게 사용하려면':: Base :: y'를 사용하십시오. – Peter

+1

나는 마이크로 소프트의 사례가 망가 졌다고 생각한다. – molbdnilo

답변

15

설명서에 약간의 혼란이 있습니다.

올바른 컴파일러 동작은 당신이 static 멤버에 도달하려고 시도하는 그 표기법을 사용하는 경우 모두이 Derived에 액세스 할 수 -Base::yBase::x입니다.

하지만 당신은 다른 범위 결정 연산자를 사용하여 글로벌 네임 스페이스 (따라서 Derived1을 우회)를 통해 문의 할 수 있습니다 는 경우 어딘가에y을 정의하는 것을 잊지 마세요, 마지막으로

int Derived2::ShowCount() 
{ 
    int cCount = ::Base::y;  
    return cCount; 
} 

을 링크 단계가 성공하기를 원합니다.

+4

이름 조회 규칙의 경로 찾기는 때로는 매우 실망 스럽습니다. – StoryTeller

+1

@ Bathsheba 위의 예에서 다른 범위 해상도를 추가하는 이유에 대한 설명을 추가해주세요. 그것은 나를 위해 매우 도움이 될 것입니다. 감사! –

+1

@PravarJawalekar : 나는 그것을 추가했다. 비공식적으로, * 전역 네임 스페이스 *를 거친다면'Derived1'을 거치지 않고 직접'Base'에 도달하게됩니다. – Bathsheba

2

변경이이에

Base::y; 

;

::Base::y;