मूल अवधारणा के साथ शुरू की सुविधा देता है,
class A {
protected:
int x;
};
class B : public A {
public:
void foo() {
int u = x; // OK : accessing inherited protected field
}
};
के बाद से बच्चे को माता-पिता इनहेरिट है, बच्चे एक्स हो जाता है। इसलिए आप सीधे बच्चे के foo() विधि में एक्स तक पहुंच सकते हैं। यह संरक्षित चर की अवधारणा है। आप सीधे बच्चे में माता-पिता के संरक्षित चर का उपयोग कर सकते हैं। नोट: यहां मैं कह रहा हूं कि आप सीधे एक्स तक पहुंच सकते हैं लेकिन ए के ऑब्जेक्ट के माध्यम से नहीं! क्या फर्क पड़ता है ? चूंकि, एक्स संरक्षित है, आप ए के बाहर ए की संरक्षित वस्तुओं तक नहीं पहुंच सकते हैं। इससे कोई फर्क नहीं पड़ता कि यह कहां है - यदि इसका मुख्य या बच्चा है। यही कारण है कि आप निम्नलिखित तरीकों से
class B : public A {
protected:
A *a;
public:
void foo() {
int u = x; // OK : accessing inherited protected field x
int w = a->x; // ERROR : accessing a's protected field x
}
};
यहां एक दिलचस्प अवधारणा आती है। आप कक्षा में अपनी वस्तु का उपयोग कर कक्षा के एक निजी चर का उपयोग कर सकते हैं!
class dummy {
private :
int x;
public:
void foo() {
dummy *d;
int y = d->x; // Even though x is private, still you can access x from object of d - But only with in this class. You cannot do the same outside the class.
}
};
// समान चर के लिए है। इसलिए आप निम्न उदाहरण तक पहुंचने में सक्षम हैं।
class B : public A {
protected:
A *a;
B *b;
public:
void foo() {
int u = x; // OK : accessing inherited protected field x
int y = b->x; // OK : accessing b's protected field x
int w = a->x; // ERROR : accessing a's protected field x
}
};
आशा है कि यह बताते हैं :)
सी ++ पूरा ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, जहां के रूप में जावा शुद्ध उन्मुख :)
लेकिन वस्तु है 'x' इस उदाहरण में' b' के एक संरक्षित सदस्य है , और पहुंच की अनुमति नहीं है। मुझे नहीं लगता कि यह सवाल का जवाब देता है। –
@ बिली ओनेल: सी ++ एक्सेस कंट्रोल में प्रति-वर्ग आधार पर काम करता है, प्रति-ऑब्जेक्ट आधार पर नहीं, इसलिए कक्षा बी का ऑब्जेक्ट कक्षा बी के अन्य ऑब्जेक्ट के सदस्यों तक पहुंच सकता है। –