過去に使用した例です。保護されたメソッドは、実装固有の機能を提供するのに最適ですが、基本クラスが適切に追跡できるようにします。オーバーライド可能な初期化関数を提供する基本クラスを検討しますが、初期化されたかどうかを判断する状態も必要です。
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
新しいクラスでは、すべての初期化は派生クラスに委任されます。例外がスローされた場合、メソッドが発生すると言う「このクラスは初期化されています」コントラクトを維持します。