मैं एक्सेस विनिर्देशों को स्थिर या गतिशील रूप से जांचने के बारे में उलझन में हूं। ऐसा कहा जाता है कि एक्सेस विनिर्देशों को गतिशील रूप से चेक नहीं किया जाता है। इसका क्या मतलब है ?कथन को समझने की आवश्यकता है "एक्सेसिबिलिटी को सांख्यिकीय रूप से चेक किया गया है और सी ++ में गतिशील रूप से नहीं है"
यह उदाहरण SO पर विभिन्न posts से लिया गया है। इस उदाहरण पर विचार
उदाहरण A:
class Base
{
public:
virtual void Message() = 0;
};
class Intermediate : public Base
{
//Is Message method virtual here too ? is it private or public ?
};
class Final : public Intermediate {
void Message() {
cout << "Hello World!" << endl;
}
};
Final final;
अब मैं इस
Final* finalPtr = &final;
finalPtr->Message();
ऊपर अभ्यस्त काम की तरह कुछ करते हैं और मैं समझता हूँ कि अंतिम कक्षा में संदेश विधि निजी है लगता है। क्या वो सही है ? यदि ऐसा है तो यह क्यों काम करता है?
Intermediate* finalPtr = &final; // or Base* finalPtr = &final;
finalPtr->Message();
में विधि कारण है कि इसके बाद के संस्करण कोड क्योंकि आधार वर्ग सूचक एक व्युत्पन्न वर्ग के साथ instantiated है काम कर रहा है है। यदि ऐसा है तो संदेश() काम करने के लिए कॉल क्यों करता है। एसओ पर पद बताता है कि चूंकि विरासत सार्वजनिक है इसलिए इसे सार्वजनिक समारोह के रूप में विरासत में मिलाया जाएगा? दूसरी तरफ, कक्षा में स्वयं के कार्य में निजी पहुंच विनिर्देशक होता है (क्योंकि डिफ़ॉल्ट रूप से कक्षा में इसका निजी)। मैं यहां उलझन में हूं और अगर कोई इसे स्पष्ट कर सकता है तो मैं सराहना करता हूं। क्या यह कहना सही होगा कि यदि बेस क्लास को व्युत्पन्न कक्षा के साथ तुरंत चालू किया जाता है। फिर बेस क्लास विधि के एक्सेस विनिर्देशित व्युत्पन्न वर्ग के एक्सेस विनिर्देशक पर प्राथमिकता लेती है?
अद्यतन:
भी मैंने देखा है कि अगर मैं निम्नलिखित
class Intermediate : public Base
{
public: //Incase this public was absent then the following example wont work
void Message() {
cout << "Hello World! Intermediate" << endl;
}
};
class Final : public Intermediate {
void Message() {
cout << "Hello World! final" << endl;
}
};
को Intermediate
और Final
कोड बदल सकते हैं और यह रूप में इस तरह
Intermediate* i = new Final();
i->Message();
तब उपयोग करने के लिए inorder आउटपुट "Hello World! final"
प्राप्त करें इंटरफ़ेस को चिह्नित करना आवश्यक है जनता के रूप में विधि। ऐसा क्यों है ? विधि Message
को जनता के रूप में विरासत में मिला था। मुझे इसे सार्वजनिक रूप से चिह्नित करने की आवश्यकता क्यों है?
आपको अन्य पोस्ट को लिंक करना चाहिए था। क्योंकि आपने नहीं किया, आपको वही स्पष्टीकरण मिलेगा जिसे आप समझ में नहीं आते हैं। –
ने अभी लिंक – Rajeshwar