2010-01-28 14 views
11

मैं वास्तव में निजी विरासत और संरक्षित विरासत के बारे में उलझन में हूं।संरक्षित विरासत व्युत्पन्न कक्षा को अपनी बेस क्लास के निजी सदस्यों तक पहुंचने की अनुमति देती है?

1) संरक्षित विरासत में, सार्वजनिक और संरक्षित सदस्य व्युत्पन्न वर्ग में संरक्षित सदस्य बन जाते हैं। निजी विरासत में, सब कुछ निजी है। हालांकि, व्युत्पन्न वर्ग कभी भी बेस क्लास के निजी सदस्यों तक नहीं पहुंच सकता है, है ना? व्युत्पन्न वर्ग दोनों मामलों में जनता और संरक्षित सदस्यों तक पहुंच सकता है। क्या वह सही है?

2) मैंने देखा कि बेस क्लास के निजी सदस्यों को व्युत्पन्न कक्षा से कभी भी छुआ नहीं जाएगा। तो निजी सदस्यों को विरासत क्यों मिला?

उत्तर

32

आप बिंदु # 1 पर सही हैं। private, protected या public निर्दिष्ट करते समय बेस क्लास से विरासत प्राप्त करने से व्युत्पन्न कक्षा में कुछ भी नहीं पहुंचता है। उन अभिगम विनिर्देशकों ने कंपाइलर को बेस-क्लास सदस्यों का इलाज कैसे किया है, जब व्युत्पन्न वर्ग के उदाहरण कहीं और उपयोग किए जाते हैं, या यदि व्युत्पन्न कक्षा को अन्य वर्गों के लिए बेस क्लास के रूप में उपयोग किया जाता है।

अद्यतन: निम्नलिखित मतभेदों को वर्णन करने में मदद कर सकते हैं:

class Base 
{ 
    private: int base_pri; 
    protected: int base_pro; 
    public: int base_pub; 
}; 

आधार से व्युत्पन्न वर्ग के लिए:

class With_Private_Base : private Base { void memberFn(); }; 
class With_Protected_Base : protected Base { void memberFn(); }; 
class With_Public_Base : public Base { void memberFn(); }; 

// this would be the same for all of the above 3 classes: 
void With_PXXX_Base::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

3 व्युत्पन्न वर्ग से व्युत्पन्न वर्ग के लिए:

class A : public With_Private_Base { void memberFn(); } 
void A::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // error: `int Base::base_pro' is protected 
    base_pub = 1; // error: `int Base::base_pub' is inaccessible 
} 

class B : public With_Protected_Base { void memberFn(); } 
void B::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

class C : public With_Public_Base { void memberFn(); } 
void C::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

पहले तीन व्युत्पन्न वर्गों तक बाहरी पहुंच:

void main() 
{ 
    With_Private_Base pri_base; 
    pri_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pri_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible 

    With_Protected_Base pro_base; 
    pro_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pro_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible 

    With_Public_Base pub_base; 
    pub_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pub_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pub_base.base_pub = 1; // OK 
} 
+0

संरक्षित विरासत और सार्वजनिक विरासत समान हैं? –

+0

@ फ़हाद: व्युत्पन्न वर्ग के दृष्टिकोण से, हां, वे हैं। बाहरी पहुंच बिंदु से (मेरे उत्तर में कोड का अंतिम ब्लॉक) वे काफी अलग हैं। –

0

1) आप सही हैं। किसी भी प्रकार की विरासत निजी सदस्यों तक पहुंच की अनुमति नहीं देती है (केवल friend घोषणाएं इसे अनुमति देती हैं)

2) वे इस अर्थ में "विरासत में" हैं कि स्मृति में संग्रहीत करते समय व्युत्पन्न प्रकार की एक वस्तु में सभी डेटा सदस्यों को शामिल किया गया है आधार के निजी सदस्यों सहित व्युत्पन्न और आधार। निजी सदस्य केवल तब नहीं जा सकते जब से उस वस्तु पर बेस के तरीके चलते हैं, उन्हें बेस के निजी सदस्यों तक पहुंचने की आवश्यकता होगी।

इसके अलावा, बेस के निजी सदस्यों के नाम तकनीकी रूप से व्युत्पन्न विधियों में गुंजाइश हैं, लेकिन निश्चित रूप से यदि आप उन्हें एक्सेस करने का प्रयास करते हैं तो आपको संकलन त्रुटि मिल जाएगी।

3

1 ए) संरक्षित विरासत का अर्थ है कि "बच्चा" सार्वजनिक विरासत में जो कुछ भी हो सकता है, उसका उपयोग कर सकता है, लेकिन उस वस्तु का उपयोग करने वाले अन्य लोग केवल बच्चे को सार्वजनिक इंटरफ़ेस देख सकते हैं, इसके माता-पिता में कुछ भी छिपा हुआ है।

1 बी) निजी विरासत के परिणामस्वरूप एक वर्ग के सभी सार्वजनिक कार्यों को निजी कार्यों के रूप में विरासत में मिलाया जाता है - जिसका अर्थ है कि उन्हें बच्चे से नहीं कहा जा सकता है या आपके ऑब्जेक्ट के क्लाइंट से एक्सेस नहीं किया जा सकता है।

2) निजी सदस्यों को विरासत में मिला है क्योंकि बेस क्लास में विधियों को उन्हें संचालित करने की आवश्यकता हो सकती है।

1

1) संरक्षित विरासत में, सार्वजनिक और संरक्षित सदस्यों व्युत्पन्न कक्षा में संरक्षित सदस्य बनने। निजी विरासत में, सबकुछ निजी है। हालांकि, व्युत्पन्न कक्षा बेस क्लास के निजी सदस्यों तक कभी भी नहीं पहुंच सकती है, है ना?

हां।

व्युत्पन्न वर्ग कर सकते हैं का उपयोग सार्वजनिक और दोनों ही मामलों में सदस्यों की रक्षा की। क्या वह सही है?

हां।

2) मैंने देखा है कि आधार वर्ग की निजी सदस्यों कभी नहीं किया व्युत्पन्न वर्ग से छुआ होगा। तो क्यों निजी सदस्यों को विरासत में मिला है?

क्योंकि वे बेस क्लास का हिस्सा हैं, और आपको बेस क्लास की आवश्यकता है जो आपके व्युत्पन्न वर्ग का हिस्सा है।नोट, आप अभी भी गैर-ओवर्रिडेन public/protected सदस्य फ़ंक्शंस का उपयोग कर बेस क्लास में बनाए गए कुछ राज्य (यदि कोई हैं) का उपयोग कर सकते हैं।

2
  1. हाँ, यह सही है। व्युत्पन्न कक्षाएं इसके बेस क्लास के संरक्षित और सार्वजनिक सदस्यों तक पहुंच सकती हैं, और व्युत्पन्न वर्ग इसके बेस क्लास के निजी सदस्यों तक नहीं पहुंच सकता है।

  2. निजी सदस्यों को निम्न कारणों से विरासत में मिला है: बेस क्लास एक संरक्षित या सार्वजनिक कार्य को परिभाषित कर सकता है जो बेस क्लास के निजी सदस्य को संशोधित करता है। व्युत्पन्न वर्ग इस फ़ंक्शन को कॉल कर सकता है, और इसलिए उस निजी चर के बारे में जानना आवश्यक है जो इसे एक्सेस कर रहा है।

संबंधित मुद्दे