개인용 상속이 필요했던 드문 경우를 보았지만 상속이 필요한 경우는 발생하지 않았습니다. 누군가가 모범을 보았습니까?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";
그냥 빨리 의견을 씨 C++의 성 (姓)은 스트로브 스트 룹이며, 나는 즉시 문제를 해결할 것입니다,) –
맙소사.! :) –