액세스 지정자가 public 인 가상 메서드를 정의하는 클래스가 있다고 가정합니다. 재정의 메서드에서 액세스 지정자를 변경할 수 있습니까? 나는 추측하고있다. 설명을 찾고 있습니다.메서드를 재정의하는 동안 액세스 지정자
답변
네, 할 수는 있지만 "괴롭히지 않습니다".
는 Overriding public virtual functions with private functions in C++ 당신은 확실히 할 수를 살펴 보자. 그러나 그것은 말이되지 않습니다. 그것이 공개 상속이라면, 당신은 항상 객체를 그 기반에 던질 수 있습니다. 개인 상속 인 경우 모든 기본 메서드는 기본적으로 이미 비공개입니다. 보호 된 상속의 경우 기본 메서드를 private으로 설정할 수 있으므로 파생 클래스가 호출하는 것을 방지 할 수 있지만 실제로 필요한 이유를 실제로 이해하지 못합니다.
예, 할 수 있습니다. 실제로는 가상의 것을 무시하거나 사용하지 않아도됩니다.
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
의 특별 선언하지 않고,
ABC
의
public
인터페이스는 참으로
D
를 통해 액세스 할 수있다.
woof
및
moo
이
virtual
인 경우 재정의를 사용하여
private
을 숨기려고합니다. 아마도 그 질문에 더 잘 대답 할 것입니다.
'class ABC'에서'private'이라면 큰 차이가있을 것입니다. 'class D'는'using' 선언에서 성공적으로 이름을 지을 수 있기 전에 기본 멤버에 대한 액세스 권한을 가져야합니다. OTOH, 그들은'ABC'에서 '보호'되었을 수 있었고 사용법은 여전히 효과가있었습니다. –
@Ben : 죄송합니다. 보호를 받으라는 의미였습니다. 결정된. – Potatoswatter
답변은 다음과 같습니다. 파생 클래스가 액세스 할 수있는 멤버의 액세스 권한 만 변경할 수 있습니다. 상속 유형은 아무런 효과가 없습니다. 상속 된 멤버 (다른 규칙에 따라 포인트까지)에 대한 기본 액세스 만 제어합니다.
따라서 기본 클래스의 보호 된 멤버를 공개 또는 비공개로 설정할 수 있습니다. 또는 기지의 공공 회원은 보호 받거나 사적이다. 그러나 기지의 개인 회원을 공개하거나 보호 할 수는 없습니다.
예 :
는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 : 오류 :이 컨텍스트 내
또한 오버라이드는 메소드 액세스를 변경하는 것과는 아무런 관련이 없습니다. 가상 개인 메서드를 재정의 할 수 있습니다. 파생 클래스에서 호출 할 수 없습니다.
- 1. 액세스 지정자
- 2. Ruby - 클래스 메서드를 재정의하는 방법?
- 3. JTextArea isEnabled() 메서드를 재정의하는 방법
- 4. 무료 메서드를 재정의하는 것이 안전합니까?
- 5. 수퍼 클래스의 수퍼 클래스 메서드를 호출하는 메서드를 재정의하는 방법?
- 6. Apex 액세스 지정자 및 테스트 클래스
- 7. UINavigationBar에서 drawRect 메서드를 동적으로 재정의하는 방법은 무엇입니까?
- 8. Django Model 필드에서이 메서드를 재정의하는 방법
- 9. 수퍼 클래스의 NSNotificationCenter 수신기 메서드를 재정의하는 방법?
- 10. 상위 생성자에서 사용되는 메서드를 재정의하는 방법은 무엇입니까?
- 11. ORM의 save 메서드를 재정의하는 것에 대한 생각
- 12. Javascript : 일부 클래스에서 공용 메서드를 재정의하는 방법?
- 13. VCS 템플릿을 재정의하는 동안 TeamCity에서 레이블 지정
- 14. Session_End 동안 HttpApplicationState에 액세스
- 15. 기본 클래스의 "기본"액세스 지정자 차이점에 대한 이유
- 16. 객관적인 c 하위 클래스의 메서드를 재정의하는 것을 피하는 방법
- 17. WPF Window.OnRender 메서드를 재정의하는 것이 화면에 그려지지 않는 이유는 무엇입니까?
- 18. UITextField leftViewRectForBounds 메서드를 재정의하는 것처럼 보일 수 없습니다.
- 19. WPF : 사용자 지정 컨트롤을 만들 때 메서드를 제대로 재정의하는 방법
- 20. .NET에서 .NET Remoting의 비 가상 메서드를 재정의하는 방법은 무엇입니까?
- 21. WCF : 부분 클래스를 사용하여 클라이언트의 Dispose 메서드를 재정의하는 것이 안전합니까?
- 22. 느슨한 던져 지정자 C++
- 23. 지정자 한정자 목록이란 무엇입니까?
- 24. printf 형식 지정자
- 25. PHP의 파일 이름 지정자
- 26. C의 형식 지정자
- 27. @Override 주석없이 수퍼 클래스/인터페이스 메서드를 재정의하는 모든 메서드를 찾는 방법은 무엇입니까?
- 28. XAML 스타일 - 트리거 된 setter를 재정의하는 동안 BasedOn을 사용하는 방법
- 29. ASIHTTPRequest : 대리자 메서드를 호출하는 동안 오류가 발생했습니다.
- 30. 메서드를 호출하는 동안 키워드를 사용해야하는 이유
그러나 인용 된 parashift.com FAQ에 나와 있듯이 이는 개인/보호 된 상속에는 적용되지 않습니다. – Potatoswatter