बस एक उदाहरण मैंने अतीत में इस्तेमाल किया है। कार्यान्वयन-विशिष्ट कार्यों को प्रदान करने के लिए संरक्षित विधियां महान हैं, साथ ही आधार वर्ग को चीजों को ठीक से ट्रैक करने की अनुमति देता है। एक आधार वर्ग पर विचार करें जो एक अतिरंजनीय आरंभीकरण फ़ंक्शन प्रदान करता है, लेकिन यह निर्धारित करने के लिए भी राज्य होना चाहिए कि क्या आरंभीकृत किया गया है:
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
हमारे नए वर्ग में, सभी आरंभिकता अभी भी व्युत्पन्न वर्ग को सौंपी गई है। एक अपवाद के रूप में फेंक दिया गया है, हम "यह वर्ग आरम्भिक है" अनुबंध को बनाए रखते हैं जो हमारी विधि कहती है।