2010-04-19 5 views

답변

1

를 살펴 보자. 그러나 그것은 말이되지 않습니다. 그것이 공개 상속이라면, 당신은 항상 객체를 그 기반에 던질 수 있습니다. 개인 상속 인 경우 모든 기본 메서드는 기본적으로 이미 비공개입니다. 보호 된 상속의 경우 기본 메서드를 private으로 설정할 수 있으므로 파생 클래스가 호출하는 것을 방지 할 수 있지만 실제로 필요한 이유를 실제로 이해하지 못합니다.

0

예, 할 수 있습니다. 실제로는 가상의 것을 무시하거나 사용하지 않아도됩니다.

class ABC { 
public: // or this may be protected, no difference 
    void woof(); 
    void moo(); 
}; 

class D : private ABC { // now woof and moo are private 
public: 
    using ABC::woof; // using declaration to make woof public again 
    ABC::moo; // access declaration (deprecated) does the same 
}; 

가상의 경우에도 똑같이 작동합니다. 또는 다른 사람들이 지적했듯이 가상 함수 조회는 구현 클래스에서 지정한 액세스를 무시합니다. 캐스팅 할 수있는 모든 클래스는 컴파일 할 때 액세스 권한을 제공 할 수 있습니다. 당신이 ABC로 업 캐스팅 할 수 없습니다 때문에 한편

, D의 특별 선언하지 않고, ABCpublic 인터페이스는 참으로 D를 통해 액세스 할 수있다. woofmoovirtual 인 경우 재정의를 사용하여 private을 숨기려고합니다. 아마도 그 질문에 더 잘 대답 할 것입니다.

+1

'class ABC'에서'private'이라면 큰 차이가있을 것입니다. 'class D'는'using' 선언에서 성공적으로 이름을 지을 수 있기 전에 기본 멤버에 대한 액세스 권한을 가져야합니다. OTOH, 그들은'ABC'에서 '보호'되었을 수 있었고 사용법은 여전히 ​​효과가있었습니다. –

+0

@Ben : 죄송합니다. 보호를 받으라는 의미였습니다. 결정된. – Potatoswatter

5

답변은 다음과 같습니다. 파생 클래스가 액세스 할 수있는 멤버의 액세스 권한 만 변경할 수 있습니다. 상속 유형은 아무런 효과가 없습니다. 상속 된 멤버 (다른 규칙에 따라 포인트까지)에 대한 기본 액세스 만 제어합니다.

따라서 기본 클래스의 보호 된 멤버를 공개 또는 비공개로 설정할 수 있습니다. 또는 기지의 공공 회원은 보호 받거나 사적이다. 그러나 기지의 개인 회원을 공개하거나 보호 할 수는 없습니다.

예 :

MAIN.C : 7 : 오류 :

class Foo 
{ 
protected: 
     void protected_member(); 

private: 
     void private_member(); 

public: 
     void public_member(); 
}; 

class Bar : private Foo 
{ 
public: 
     using Foo::protected_member; 
     using Foo::private_member; 
     using Foo::public_member; 
}; 

int main(int, const char**) 
{ 
     Bar bar; 

     return 0; 
} 

상기 코드 g ++ 4.1.2 다음 오류 이끌어

'무효 푸 :: PRIVATE_MEMBER()는'비공개

main.C : 14 : 오류 :이 컨텍스트 내

또한 오버라이드는 메소드 액세스를 변경하는 것과는 아무런 관련이 없습니다. 가상 개인 메서드를 재정의 할 수 있습니다. 파생 클래스에서 호출 할 수 없습니다.

관련 문제