과거에 사용한 예일뿐입니다. 보호 된 메소드는 구현 별 함수를 제공하는 데 유용하지만 기본 클래스가 올바르게 추적 할 수 있습니다. 재정의 가능한 초기화 함수를 제공하지만 초기화 여부를 결정하는 상태가 있어야하는 기본 클래스를 고려하십시오.
class Base
{
private:
bool m_bInitialized;
public:
virtual void Initialize() = 0;
void setInitialized() { m_bInitialized = true; };
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
여기는 모두 좋고 훌륭합니다. 파생 클래스가 setInitialized()
누구라도 호출 할 수 있다는 사실 을 부르지 않을 때를 제외하고는 (여기서는 이것을 보호 할 수 있으며 보호 된 메소드를 사용해야하는 또 다른 이유가 있습니다!). 가상 보호 멤버를 사용하는 클래스를 선호합니다.
class Base
{
private:
bool m_bInitialized;
protected:
virtual void InitializeImpl() = 0;
public:
void Initialize()
{
InitializeImpl();
m_bInitialized = true;
}; // eo Initialize
bool isInitialized() const { return m_bInitialized; };
}; // eo class Base
새 클래스에서 모든 초기화는 여전히 파생 클래스에 위임됩니다. 예외가 발생하면 우리는 "이 클래스가 초기화되었습니다"라는 계약을 유지합니다.