विरासत को निजी बनाकर, आप मूल रूप से कह रहे हैं कि यहां तक कि यह भी कि ए को विरासत में मिला है (बिल्कुल भी) निजी है - बाहरी दुनिया के लिए सुलभ / दृश्यमान नहीं है।
अगर इसकी अनुमति दी गई तो क्या होगा, इसकी लंबी-चौड़ी चर्चा के बिना, साधारण तथ्य यह है कि इसकी अनुमति नहीं है। यदि आप व्युत्पन्न प्रकार की वस्तु को संदर्भित करने के लिए आधार के लिए एक सूचक का उपयोग करना चाहते हैं, तो आप सार्वजनिक विरासत का उपयोग करने के साथ बहुत अधिक फंस गए हैं।
निजी विरासत जरूरी नहीं है (या सामान्य रूप से भी) Liskov प्रतिस्थापन सिद्धांत का पालन करना है । लोक विरासत का दावा है कि एक व्युत्पन्न वस्तु आधार वर्ग का एक उद्देश्य के लिए प्रतिस्थापित किया जा सकता है, और उचित अर्थ विज्ञान होगा अभी भी उत्पन्न होती हैं। निजी विरासत हालांकि यह दावा नहीं करता है । निजी विरासत द्वारा निहित संबंध का सामान्य विवरण "के संदर्भ में" लागू किया गया है।
सार्वजनिक विरासत का मतलब है कि एक व्युत्पन्न वर्ग आधार वर्ग की सभी क्षमताओं को बनाए रखता है और संभावित रूप से इसके अलावा अधिक जोड़ता है। निजी विरासत का अर्थ अक्सर कम या ज्यादा विपरीत होता है: यह कि व्युत्पन्न वर्ग एक सामान्य आधार वर्ग का उपयोग करता है ताकि अधिक प्रतिबंधित इंटरफ़ेस के साथ कुछ को लागू किया जा सके।
उदाहरण के लिए, आइए इस क्षण के लिए मान लें कि C ++ मानक पुस्तकालय में कंटेनरों को टेम्पलेट के बजाय वंशानुक्रम का उपयोग करके लागू किया गया था। वर्तमान प्रणाली में, std::deque
और std::vector
कंटेनर हैं, और std::stack
एक कंटेनर एडाप्टर है जो एक अधिक प्रतिबंधित इंटरफ़ेस प्रदान करता है। चूंकि यह टेम्प्लेट पर आधारित है, आप या std::stack
तो एडॉप्टर के रूप में उपयोग कर सकते हैं ।std::deque
std::vector
यदि हम विरासत के साथ अनिवार्य रूप से समान प्रदान करना चाहते थे, तो हम शायद निजी विरासत का उपयोग std::stack
करेंगे , इसलिए कुछ इस तरह होगा:
class stack : private vector {
};
इस मामले में, हम निश्चित रूप से नहीं चाहते हैं कि उपयोगकर्ता हमारे हेरफेर करने stack
में सक्षम हो जैसे कि यह एक था vector
। ऐसा करने से (और संभावना) एक स्टैक की अपेक्षाओं का उल्लंघन हो सकता है (उदाहरण के लिए, उपयोगकर्ता विशुद्ध रूप से स्टैक जैसी फैशन के बजाय बीच में आइटम सम्मिलित / हटा सकता है)। हम मूल vector
रूप से अपने स्टैक को लागू करने के लिए एक सुविधाजनक तरीके के रूप में उपयोग कर रहे हैं , लेकिन अगर (उदाहरण के लिए) हमने stack
अकेले स्टैंड के लिए कार्यान्वयन को बदल दिया (बेस क्लास पर निर्भरता नहीं है) या इसके संदर्भ में इसे फिर से लागू करते हैं std::deque
, तो हम ऐसा नहीं चाहते हैं किसी भी क्लाइंट कोड को प्रभावित करने के लिए - क्लाइंट कोड के लिए, यह सिर्फ एक स्टैक माना जाता है, न कि कुछ विशेष किस्म के वेक्टर (या डीके)।
protected