आभासी सदस्य को निजी घोषित करने के लिए सभी कॉल करने के बावजूद, तर्क बस पानी नहीं रखता है। अक्सर, एक वर्चुअल फ़ंक्शन के एक व्युत्पन्न वर्ग के ओवरराइड को बेस क्लास संस्करण को कॉल करना होगा। यह घोषित नहीं किया जा सकता है 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 */ }
...
इस प्रकार हर्ब सटर की गाइडलाइन # 3 ... लेकिन घोड़ा वैसे भी खलिहान से बाहर है।
जब आप कुछ घोषित करते हैं, protected
तो आप किसी भी व्युत्पन्न वर्ग के लेखक पर भरोसा करने के लिए संरक्षित आंतरिकों को समझने और ठीक से उपयोग करने के लिए, जिस तरह से एक friend
घोषणा private
सदस्यों के लिए एक गहरा विश्वास का अर्थ है ।
जिन उपयोगकर्ताओं को उस ट्रस्ट का उल्लंघन करने से बुरा व्यवहार मिलता है (जैसे कि आपके दस्तावेज़ पढ़ने के लिए परेशान न होकर 'क्लूलेस' लेबल) केवल स्वयं को दोषी मानते हैं।
अपडेट : मेरे पास कुछ प्रतिक्रियाएं हैं जो दावा करती हैं कि आप निजी वर्चुअल फ़ंक्शंस का उपयोग करके इस तरह से वर्चुअल फ़ंक्शन कार्यान्वयन "चेन" कर सकते हैं। यदि हां, तो मुझे यकीन है कि यह देखना पसंद करेंगे।
C ++ संकलक मैं निश्चित रूप से एक व्युत्पन्न वर्ग कार्यान्वयन को एक निजी बेस क्लास कार्यान्वयन कॉल नहीं होने दूंगा।
यदि C ++ समिति ने "निजी" को इस विशिष्ट पहुंच की अनुमति देने के लिए आराम किया है, तो मैं सभी निजी आभासी कार्यों के लिए हूं। जैसा कि यह खड़ा है, घोड़े चोरी होने के बाद भी हमें खलिहान का दरवाजा बंद करने की सलाह दी जा रही है।