개인용 상속이 필요했던 드문 경우를 보았지만 상속이 필요한 경우는 발생하지 않았습니다. 누군가가 모범을 보았습니까?C++에서 상속을 보호해야 할 필요가있는 예제가 있습니까?
답변
여기에 사람들은 Protected 클래스 상속 및 Protected 메서드를 실수 한 것처럼 보입니다.
FWIW, 보호 된 클래스 상속을 사용하는 사람을 본 적이 없으며 Stroustrup이 "보호 된"레벨을 C++의 실수라고 생각한다고 생각합니다. 보호 수준을 없애고 공개 및 비공개에만 의존한다면 할 수없는 소중한 가치가 있습니다.
C++ FAQ Lite은 개인 상속을 사용하는 것이 합법적 인 해결책이라고 언급합니다 ([24.3.] Which should I prefer: composition or private inheritance? 참조). (이 경우 derivedFunction()
에) 가상 함수를 통해 개인 기본 클래스 내에서 파생 된 클래스를 호출 할 때 : 당신은 파생 클래스에서 파생하려면 지금
class SomeImplementationClass
{
protected:
void service() {
derivedFunction();
}
virtual void derivedFunction() = 0;
// virtual destructor etc
};
class Derived : private SomeImplementationClass
{
void someFunction() {
service();
}
virtual void derivedFunction() {
// ...
}
// ...
};
, 당신은 Base::service()
를 사용하려면 파생 된 클래스 내에서 Derived::someFunction()
을 파생 클래스로 이동하려는 경우이를 수행하는 가장 쉬운 방법은 Base
의 개인 상속을 보호 된 상속으로 변경하는 것입니다.
죄송합니다. 더 구체적인 예를 생각해 볼 수 없습니다. 개인적으로 나는 모든 상속을 공개하여 "상속 관계 보호 또는 사적으로해야합니까?"라는 논의로 시간 낭비를 피하기를 좋아합니다.
포스터에서 물어 본 내용이 아니라 보호받는 상속에 대해 물었습니다. 당신이 사적 상속을 원하는 경우는 분명하지만 너무 많지는 않습니다. –
보호 상속의 매우 드문 경우가 있습니다.
struct base {
virtual ~base() {}
virtual base & getBase() = 0;
};
struct d1 : private /* protected */ base {
virtual base & getBase() {
return this;
}
};
struct d2 : private /* protected */ d1 {
virtual d1 & getBase() {
return this;
}
};
이전의 코드 조각은 기본 클래스 숨길하고 "getBase"기능을 제공하여, 어떤 이유 기지와 그 기능의 제어 가시성을 제공하기 위해 노력 : 당신이 covariance을 활용하고자하는 곳이다.
d2
은 d2
이 아니기 때문에 이 base
에서 파생 된 것을 알 수 없으므로 구조체가 실패합니다. 따라서 covariance
은 작동하지 않습니다. 이것의 한 가지 방법은 보호 된 것을 파생 시켜서 상속을 d2에서 볼 수 있도록하는 것입니다.
비슷한 사용 예는 std::ostream
에서 파생되었지만 임의의 사용자가 내 스트림에 쓸 수 없도록하려는 경우입니다. 을 반환하는 가상 getStream
함수를 제공 할 수 있습니다. 이 함수는 다음 작업을위한 스트림 준비를 일부 수행 할 수 있습니다. 예를 들어 특정 조종을 넣어
std::ostream& d2::getStream() {
this->width(10);
return *this;
}
logger.getStream() << "we are padded";
- 1. C#에서 상속을 동적으로 할 수 있습니까?
- 2. Singleton 클래스에 상속을 적용 할 수 있습니까?
- 3. Nhibernate의 상속을 나에게 설명 할 수 있습니까?
- 4. ACL 상속을 어디에서 관리 할 수 있습니까?
- 5. 루비에서 다중 상속을 달성 할 수 있습니까?
- 6. Webcam 통합 예제가 있습니까?
- 7. 좋은 SimpleSAMLphp SLO 예제가 있습니까?
- 8. django-proxy를 사용하는 예제가 있습니까?
- 9. Webview 예제가 주위에 회전 있습니까?
- 10. powershell에 DSL의 다른 예제가 있습니까?
- 11. 개인 상속을 사용할 권리가 있습니까?
- 12. 다중 상속을 통해이 작업을 수행 할 수 있습니까?
- 13. C#에서 인터페이스와 합성 및 상속을 결합 할 수 있습니까?
- 14. 다중 상속을 사용하여 사용 역할을 차별화 할 수 있습니까?
- 15. C++ : 컴파일 타임에 가상 상속을 감지 할 수 있습니까?
- 16. C# : 인터페이스와 구현 인스턴스를 사용하여 상속을 시뮬레이트 할 수 있습니까?
- 17. C에서 가능하기 때문에 C에서 temeplatization을 달성 할 수 있습니까?
- 18. delete 연산자가 정적 일 필요가있는 이유는 무엇입니까?
- 19. 어떻게 C에서 오디오를 녹음 할 수 있습니까?
- 20. C에서 J2ME로 변환 할 수있는 도구가 있습니까?
- 21. C에서 파이썬 튜플을 모방 할 수 있습니까?
- 22. Objective-C에서 프로토콜을 상속 할 수 있습니까?
- 23. 괜찮은 PHP Facebook Connect 예제가 온라인에 있습니까?
- 24. Node.js 필요가있는 프로토 타입 상속
- 25. 안드로이드를 배울 필요가있는 것은 무엇입니까?
- 26. 이 상황에서 상속을 사용할 수 있습니까? (Java)
- 27. jQuery를 사용하여 설문 조사 만들기 - 예제가 있습니까?
- 28. Silverlight에서 자동 DataContext 상속을 중지하는 방법이 있습니까?
- 29. 누구나 Spring AOP @DeclareParents 예제가 있습니까?
- 30. HTTPRiot 및 iPhone 용 XML 예제가 있습니까?
그냥 빨리 의견을 씨 C++의 성 (姓)은 스트로브 스트 룹이며, 나는 즉시 문제를 해결할 것입니다,) –
맙소사.! :) –