2008-08-28 15 views

답변

13

여기에 사람들은 Protected 클래스 상속 및 Protected 메서드를 실수 한 것처럼 보입니다.

FWIW, 보호 된 클래스 상속을 사용하는 사람을 본 적이 없으며 Stroustrup이 "보호 된"레벨을 C++의 실수라고 생각한다고 생각합니다. 보호 수준을 없애고 공개 및 비공개에만 의존한다면 할 수없는 소중한 가치가 있습니다.

+0

그냥 빨리 의견을 씨 C++의 성 (姓)은 스트로브 스트 룹이며, 나는 즉시 문제를 해결할 것입니다,) –

+0

맙소사.! :) –

1

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의 개인 상속을 보호 된 상속으로 변경하는 것입니다.

죄송합니다. 더 구체적인 예를 생각해 볼 수 없습니다. 개인적으로 나는 모든 상속을 공개하여 "상속 관계 보호 또는 사적으로해야합니까?"라는 논의로 시간 낭비를 피하기를 좋아합니다.

+1

포스터에서 물어 본 내용이 아니라 보호받는 상속에 대해 물었습니다. 당신이 사적 상속을 원하는 경우는 분명하지만 너무 많지는 않습니다. –

5

보호 상속의 매우 드문 경우가 있습니다.

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을 활용하고자하는 곳이다.

d2d2이 아니기 때문에 이 base에서 파생 된 것을 알 수 없으므로 구조체가 실패합니다. 따라서 covariance은 작동하지 않습니다. 이것의 한 가지 방법은 보호 된 것을 파생 시켜서 상속을 d2에서 볼 수 있도록하는 것입니다.

비슷한 사용 예는 std::ostream에서 파생되었지만 임의의 사용자가 내 스트림에 쓸 수 없도록하려는 경우입니다. 을 반환하는 가상 getStream 함수를 제공 할 수 있습니다. 이 함수는 다음 작업을위한 스트림 준비를 일부 수행 할 수 있습니다. 예를 들어 특정 조종을 넣어

std::ostream& d2::getStream() { 
    this->width(10); 
    return *this; 
} 

logger.getStream() << "we are padded";