कुछ 'सार्वजनिक' बनाना एक अनुबंध बनाता है जो सभी विरासत कक्षाओं पर बाध्यकारी होगा। कुछ 'संरक्षित' बनाना सीधे -हित कक्षाओं के साथ अनुबंध बनाता है, लेकिन वर्गों को उनके किसी भी वंशज को ऐसा अनुबंध उपलब्ध कराने के लिए मजबूर नहीं करता है।
यदि कोई उम्मीद करता है कि बेस क्लास के लिए स्रोत कोड किसी भी व्यक्ति के लिए उपलब्ध होगा, और उम्मीद है कि बेस क्लास कभी नहीं बदलेगी (आमतौर पर इसका मतलब है कि बेस क्लास का उपयोग करने का कारण है व्युत्पन्न वर्गों के लिए आवश्यक कोड की मात्रा को कम करने के बजाय, व्युत्पन्न वर्गों के साथ सार्वजनिक रूप से उपयोग किए जाने वाले बेस-सदस्यों के सार्वजनिक सदस्यों और गुणों का उपयोग किया जाता है) और यदि सभी सार्वजनिक विधियां आभासी या सीधे वर्चुअल विधियों में बंधी जाती हैं, तो इसके लिए बहुत अधिक नुकसान नहीं होता है संरक्षित वर्चुअल गेटर्स/सेटर्स की बजाय संरक्षित फ़ील्ड का उपयोग करना। यदि किसी वंश वर्ग को खेतों का उपयोग करने के तरीके को बदलने की जरूरत है, तो यह उन सभी विधियों को आसानी से ओवरराइड कर सकता है जो उनका उपयोग करते हैं।
यदि कोई उम्मीद करता है कि व्युत्पन्न कक्षाएं उन परिस्थितियों में बनाई जा सकती हैं जहां पदानुक्रम में उनके ऊपर की कक्षाएं पूरी तरह से ज्ञात नहीं हैं या अपरिवर्तनीय नहीं हैं, तो यह संरक्षक गेटर्स/सेटर्स को सुरक्षित रखने के लिए अधिक उपयुक्त हो सकता है, लेकिन यह जिम्मेदारी हो सकती है जो भी पदानुक्रम में 'अपारदर्शी' परत बनाता है के साथ छोड़ दिया।
उदाहरण: एक संग्रह 'गिनती' नामक फ़ील्ड को बनाए रख सकता है। संग्रह का एक मूल संस्करण चीजों को इस तरह से स्टोर कर सकता है जो हमेशा उस क्षेत्र को बनाए रखना आसान बनाता है जो हमेशा वस्तुओं की संख्या रखता है, लेकिन व्युत्पन्न संस्करण चीजों को इस तरह से स्टोर कर सकता है जिससे यह मुश्किल हो जाता है। "गिनती" नामक एक क्षेत्र बनाकर, बेस क्लास अपने प्रत्यक्ष वंशजों का वादा करता है कि वह उस क्षेत्र में वस्तुओं की संख्या बनाए रखेगा। एक व्युत्पन्न वर्ग चीजों को अलग-अलग स्टोर कर सकता है, जैसे "गिनती" क्षेत्र सार्थक नहीं था।ऐसी कक्षा केवल पढ़ने-योग्य संपत्ति के साथ गिनती क्षेत्र को छाया दे सकती है; इसके वंशजों को पता होगा कि उन्हें एक संपत्ति पढ़नी पड़ी, जबकि मूल वर्ग के वंशज यह जान लेंगे कि वे एक क्षेत्र पढ़ सकते हैं।
सबसे महत्वपूर्ण बात यह है कि कक्षा में संरक्षित चीजें केवल प्रत्यक्ष वंशजों के साथ अनुबंध बनाती हैं, और वे वंशज निर्णय ले सकते हैं कि उप-वंश के लिए एक समान अनुबंध उपलब्ध कराया जाए या नहीं।
अनुपूरक: संरक्षित वर्चुअल गेटर्स और सेटर्स जोड़कर प्राप्त की गई एकमात्र चीज व्युत्पन्न कक्षाओं को बदलने के लिए क्षमता होगी बेस क्लास कोड फ़ील्ड/गुणों का उपयोग कैसे करता है। कभी-कभी यह आवश्यक होगा, लेकिन अक्सर यह समस्याएं पैदा करेगा। उदाहरण के लिए, यदि संग्रह में हाल ही में जोड़े गए आइटमों को हटाया जा सकता है, तो व्युत्पन्न वर्ग चीजों को लपेट सकता है ताकि अंतिम कुछ आइटम जोड़े गए छोटे "बोनस" संग्रह में रखे जाएं और पर्याप्त अतिरिक्त आइटम जोड़े जाने के बाद मुख्य संग्रह में स्थानांतरित किया जा सके। मुख्य संग्रह के लिए कोड अपने स्वयं के "गिनती" क्षेत्र की अपेक्षा करेगा ताकि यह इंगित किया जा सके कि मुख्य संग्रह में कितनी वस्तुएं हैं। यदि एक वंशज वर्ग अपनी गिनती को शामिल करने के लिए "गिनती" संपत्ति को ओवरराइड करता है, तो मुख्य कोड टूट जाएगा। वंश वर्ग को छाया गिनती फ़ील्ड चाहिए, इसलिए इसके वंशजों को एक गिनती दिखाई देगी जिसमें बोनस आइटम शामिल हैं, लेकिन बेस क्लास अभी भी उस गिनती को देखेगा जिसमें केवल अपनी वस्तुएं शामिल होंगी।
आपको क्यों लगता है कि बाद में व्युत्पन्न कक्षाओं में सदस्य चर की आवश्यकता होगी? उनके लिए क्या आवश्यकता होगी, और उन्हें उजागर करने की आवश्यकता क्यों होगी? –