2010-04-13 5 views
10

सी ++ में आप एक सदस्य को बेस क्लास में और एक सदस्य को विरासत में उसी नाम के साथ रख सकते हैं।सी ++ विरासत में कक्षा का नाम उसी नाम का सदस्य है

मैं वंचित वर्ग में किसी विशिष्ट व्यक्ति को कैसे एक्सेस कर सकता हूं?

+3

प्रश्न पूछना चाहिए कि आपके पास समान विरासत पदानुक्रम में कक्षाएं क्यों हैं जिनके पास डुप्लिकेट नाम वाले सदस्य हैं जो अलग हैं? प्रभावी सी ++ आइटम 33 देखें। – TheJuice

+0

यदि आपका प्रश्न मूल संदर्भ या सूचक से व्युत्पन्न विधि तक पहुंचने का तरीका है, तो एक टिप्पणी जोड़ें। जैसा कि लिखा गया है, प्रश्न को दो तरीकों से व्याख्या किया जा सकता है (और सभी उत्तरों में से केवल एक के साथ सौदा) उदाहरण के लिए –

उत्तर

24

उस स्थिति में आपको सदस्य नाम पूरी तरह से अर्हता प्राप्त करनी चाहिए।

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

classname:: के साथ इसे उपसर्ग करके।

7

यदि आप नाम निर्दिष्ट करते हैं तो आप विरासत में से किसी एक को स्वचालित रूप से एक्सेस करेंगे। यदि आप का मतलब है कि आप बेस क्लास में से किसी एक को कैसे एक्सेस करते हैं, तो बेस :: सदस्य

3

हाँ का उपयोग करें।

कक्षा नाम के साथ f(), अपनी कक्षा योग्यता: SpecificClass::f()

6

बेस क्लास में छिपे हुए सदस्य तक पहुंचने के लिए आपको बेस क्लास नाम के साथ सदस्य का नाम उपसर्ग करना होगा। नीचे देखें:

class A 
{ 
protected: 
    int i; 
}; 

class B : public A 
{ 
public: 
    void foo(void) 
    { 
     int a_i = A::i; 
     int b_i = i; 
     int b_i_as_well = B::i; 
    } 
private: 
    int i; 
}; 
+0

+2 [मेरी इच्छा है]। –

3

एक दृष्टिकोण (पहले से ही सभी अन्य उत्तर में वर्णित) Base::member की तरह योग्य सदस्य के नाम का उपयोग करने के लिए, है। इसका उपयोग this पॉइंटर के माध्यम से स्पष्ट पहुंच के साथ किया जा सकता है, यदि यह आपकी शैली है: this->Base::member

एक और तरीका this पॉइंटर के माध्यम से पहुंच करने के लिए स्पष्ट रूप से बेस क्लास प्रकार में परिवर्तित किया गया है: ((Base *) this)->member

बेशक, this सूचक के उपरोक्त संदर्भ इस धारणा के तहत किए गए हैं कि आप कक्षा के कुछ गैर स्थैतिक सदस्य समारोह के भीतर से सदस्य तक पहुंचने का प्रयास कर रहे हैं। "बाहर" से पहुंचने के लिए, एक ही चाल किसी भी अन्य सूचक (या संदर्भ) पर लागू की जा सकती है: some_pointer->Base::member या ((Base *) some_pointer)->member

डेटा सदस्यों के लिए ये दो दृष्टिकोण समकक्ष हैं। सदस्य कार्यों के लिए वे वर्चुअल फ़ंक्शंस के साथ अलग-अलग परिणाम ले सकते हैं। इस कारण से, सामान्य रूप से, पहला दृष्टिकोण प्राथमिकता दी जानी चाहिए।