2010-06-13 15 views
5

आप व्याख्या कर सकते हैं क्यों यह अनुमति नहीं है की दृश्यता,सी ++ विरासत: देखते हुए और सदस्यों

#include <stdio.h> 

class B { 
private: 
    int a; 
public: 
    int a; 
}; 

int main() { 
    return 0; 
} 

जबकि इस है?

#include <stdio.h> 

class A { 
public: 
    int a; 
}; 

class B : public A{ 
private: 
    int a; 
}; 

int main() { 
    return 0; 
} 

दोनों ही मामलों में, हम एक सार्वजनिक और एक निजी चर class B में a नामित किया है।


अब संपादित किया गया!

+0

@Neil: आपका मतलब है कि दूसरा वर्ग कक्षा ए घोषित करता है? – Alan

+1

@ आलान हां - मैं इस सवाल से इतना उलझन में था कि मुझे थोड़ा उलझन मिला :-) –

+3

इसका डाउनवोट क्यों है? यह एक उचित सवाल है, मुझे सी ++ में कक्षाएं सीखते समय वही बात सोचना याद है ... – Cam

उत्तर

15

दोनों ही मामलों में, हम वर्ग बी

नहीं है, सच नहीं thats में एक सार्वजनिक और एक निजी चर नाम के एक है।

पहले मामले में, आपके पास एक ही दायरे में एक ही नाम के साथ दो पहचानकर्ता नहीं हो सकते हैं। जबकि दूसरे मामले में, B::a छुपाता A::a, और उपयोग करने के लिए A::a आप पूरी तरह से नाम अर्हता प्राप्त करने के लिए है:

पहले उदाहरण में
b.a = 10; // Error. You can't access a private member. 
b.A::a = 10; // OK. 
0

पहली बार अनुमति नहीं है क्योंकि यह अस्पष्ट परिभाषाओं की ओर जाता है। दूसरे में, यद्यपि आपके पास सार्वजनिक और निजी दोनों a पूर्णांक चर है, तो आपने अपनी बी कक्षा के अंदर ए :: छुपाया है। कंपाइलर निश्चित रूप से जानता है कि आप क्या चाहते हैं क्योंकि एक छिपे हुए चर को स्पष्ट रूप से एक्सेस करने का कोई तरीका है।

मुझे यह भी विश्वास है कि यह मैंगलिंग नाम देने के लिए उबलता है: भंडारण विनिर्देश वास्तविक नाम के हिस्से के रूप में समाप्त नहीं होते हैं। हालांकि मैं इस पर गलत हो सकता था।

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

अपने वर्ग ख अंदर

:

class b { 

int a; 
public: 
int a; 

void myMethod() 
{ 
a = 10; //what a should the compiler use? Ambiguous, so the compiler sez BZZT. 
} 

} 

2 उदाहरण के लिए:

class A 
{ 
public: 
int a; 
} 

class B: public A 
{ 
private: 
int a; 

void someMethod() 
{ 
a = 10; //implied that you are using B::a (which may be a programmer error) 

} 

} 
+0

इसके लिए खेद है। अब संपादित किया गया! – Moeb

3

क्योंकि B::aछुपाता दूसरे उदाहरण मेंA::a। आप अभी भी इसका उपयोग कर सकते हैं, लेकिन संकलक के लिए यह स्पष्ट योग्यता की आवश्यकता है कि आप यह समझ लें कि आप समान कक्षा के साथ मूल वर्ग के सदस्य से पूछ रहे हैं।

पहले उदाहरण में a दोनों एक ही दायरे में हैं, जबकि दूसरे उदाहरण में स्कॉप्स अलग हैं।

0

कक्षा बी मान्य नहीं है क्योंकि सी ++ उनके उपयोग विनिर्देशक से सदस्य (सार्वजनिक भेद नहीं कर सकते नहीं है/निजी/सुरक्षित)। हालांकि, नामस्थान सी ++ सदस्यों को अलग करने का एक तरीका है। दूसरे कोड में कक्षा बी में आपके पास "सार्वजनिक ए" और "निजी ए" नहीं है, आपके पास B::a और A::a है।

भले ही अलग-अलग एक्सेस विनिर्देशकों के साथ समान नाम/हस्ताक्षर के सदस्यों को घोषित करने की अनुमति दी गई हो, तो सही सदस्य को संबोधित करने का कोई तरीका नहीं होगा।

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