मान लीजिए कि अधिभार संकल्प से पहले अभिगम नियंत्रण आया था। प्रभावी रूप से, इसका मतलब होगा कि public/protected/private
पहुँच क्षमता के बजाय दृश्यता नियंत्रित।
स्ट्रॉस्ट्रुप द्वारा सी ++ के डिजाइन और विकास का खंड 2.10 इस पर एक मार्ग है जहां वह निम्नलिखित उदाहरण पर चर्चा करता है
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup उल्लेख मौजूदा नियमों (पहुँच से पहले दृश्यता) की एक लाभ यह है कि (अस्थायी) chaning है कि private
अंदर class X
में public
(जैसे डिबगिंग के प्रयोजनों के लिए) उपरोक्त कार्यक्रम के अर्थ में कोई चुप परिवर्तन है कि वहाँ (यानी है X::a
करने का प्रयास किया है दोनों मामलों में पहुँचा जा सकता है, जो उपरोक्त उदाहरण में एक एक्सेस त्रुटि देता है)। यदि public/protected/private
दृश्यता को नियंत्रित करेगा, तो कार्यक्रम का अर्थ बदल जाएगा (वैश्विक के a
साथ कहा जाएगा private
, अन्यथा X::a
)।
उसके बाद उन्होंने कहा कि उन्हें याद नहीं है कि यह स्पष्ट डिजाइन द्वारा किया गया था या प्रीप्रोसेसर तकनीक का एक साइड इफेक्ट था जिसका उपयोग सी को क्लासेस पूर्ववर्ती के साथ मानक सी ++ में लागू किया गया था।
यह आपके उदाहरण से कैसे संबंधित है? मूल रूप से क्योंकि मानक बनाया अधिभार संकल्प सामान्य नियम के अनुरूप है कि नाम लुकअप एक्सेस कंट्रोल से पहले आता है।
10.2 सदस्य का नाम लुकअप [class.member.lookup]
1 सदस्य नाम लुकअप एक वर्ग गुंजाइश (3.3.7) में एक नाम (आईडी-अभिव्यक्ति) का अर्थ निर्धारित करता है। नाम लुकअप में अस्पष्टता हो सकती है, जिस स्थिति में प्रोग्राम बीमार है। एक आईडी-एक्सप्रेशन के लिए, नाम लुकअप इस के वर्ग दायरे में शुरू होता है; एक योग्य-आईडी के लिए, नेस्टेम- स्पेसियर के दायरे में नाम देखने की शुरुआत होती है। अभिगम नियंत्रण (3.4, खण्ड 11) से पहले नाम देखने की क्रिया होती है ।
8 यदि एक अतिभारित फ़ंक्शन का नाम स्पष्ट रूप से पाया जाता है,
अभिगम नियंत्रण से पहले ओवरलोडिंग रिज़ॉल्यूशन (13.3) भी होता है । एंबीगुएट्स को अक्सर एक नाम को उसके वर्ग के नाम के साथ क्वालीफाई करके हल किया जा सकता है।