가상 멤버를 비공개로 선언하라는 모든 호출에도 불구하고이 주장은 단순히 물을 유지하지 않습니다. 종종 파생 클래스의 가상 함수 재정의는 기본 클래스 버전을 호출해야합니다. 선언되면 할 수 없습니다 private
.
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
당신은 이 기본 클래스 메서드를 선언 protected
.
그런 다음 메서드를 재정의해야하지만 호출해서는 안된다는 주석을 통해 표시하는 추악한 방법을 취해야합니다.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
따라서 Herb Sutter의 가이드 라인 # 3 ... 그러나 말은 어쨌든 헛간에서 나왔습니다.
무언가를 선언 할 때 protected
어떤 파생 클래스의 작성자가 보호 된 내부를 이해하고 적절하게 사용하기 위해 암시 적으로 신뢰하는 것입니다. friend
선언이 private
멤버에 대한 더 깊은 신뢰를 의미하는 것과 같습니다 .
그러한 신뢰를 위반하여 나쁜 행동을하는 사용자 (예 : 문서를 읽지 않고 '단서 없음'으로 표시)는 자신을 비난 할 수 있습니다.
업데이트 : 비공개 가상 기능을 사용하여 가상 기능 구현을 이러한 방식으로 "체인"할 수 있다는 의견이 있습니다. 그렇다면 꼭보고 싶습니다.
필자가 사용하는 C ++ 컴파일러는 파생 클래스 구현이 전용 기본 클래스 구현을 호출하도록 허용하지 않습니다.
C ++위원회가이 특정 액세스를 허용하기 위해 "비공개"를 완화했다면, 저는 모두 비공개 가상 기능을 사용할 것입니다. 말이 도난당한 후에도 헛간 문을 잠 그라는 권고를 받고 있습니다.