2011-11-04 11 views
14

g++ मुझे एक प्रकार तक पहुंच से इनकार कर रहा है, क्योंकि यह एक निजी दादा पिता होता है। इसका कोई मतलब भी है क्या?निजी विरासत के कारण पहुंच योग्य प्रकार

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(A const& a) {} 
}; 

संकलन इस पैदावार:

1:10: error: ‘struct A A::A’ is inaccessible 
6:12: error: within this context 

मेरे बिंदु है: मैं एक पूर्वज के रूप में A उपयोग करने के लिए कभी नहीं चाहता था। वास्तव में, यदि AB का निजी पूर्वज है, तो यह किसी के लिए पूरी तरह से अदृश्य नहीं होना चाहिए, लेकिन B (यानी C)?

बेशक, मैं protected विरासत का उपयोग कर सकता हूं लेकिन मेरे मामले में यह वास्तव में समझ में नहीं आता है।

उत्तर

13

यह A से इंजेक्शन क्लास नाम के अंदर वैश्विक A छिपाने के कारण है। हालांकि A दिखाई दे रहा है, यह पहुंच योग्य नहीं है (क्योंकि इसे निजी के रूप में आयात किया जाता है), इसलिए त्रुटि। आप वैश्विक नामस्थान में इसे देखकर A तक पहुंच सकते हैं:

void foo(::A const& a) {} 
8

आप यह घोषणा करता है, तो इस प्रकार यह

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(::A const& a) {} 
}; 

त्रुटि आपके दर्शन नाम नहीं संकल्प का उपयोग करने के लिए क्या है काम करता है। :: ए कहते हैं कि वैश्विक नामस्थान को मेरी विरासत में घोंसला वाले वर्ग प्रकार नहीं हैं। यह भी याद रखें कि निजी विरासत सिर्फ यह कह रही है कि बी में ए है और आईएमओएचओ एक बेवकूफ भाषा सुविधा है जिसे टालना चाहिए।

+1

यह बिल्कुल बेवकूफ सुविधा नहीं है; यह 'उपयोग' के साथ खुलासा करने के लिए व्यक्तिगत रूप से कार्यों को चुनकर विरासत इंटरफ़ेस को प्रतिबंधित करने की अनुमति देता है। – avakar

+2

जो आप फॉरवर्डर फ़ंक्शंस के साथ सुविधा के साथ कर सकते हैं और सी ++ विरासत मॉडल को कम अव्यवस्थित बना सकते हैं। निजी विरासत विरासत की संरचना नहीं है और दो अलग-अलग अवधारणाओं को पूरा करने के लिए समान अर्थशास्त्र का उपयोग केवल भ्रमित है। – rerun

+2

यह संरचना और निजी विरासत के बीच एक अंतर है, क्योंकि उत्तरार्द्ध आपको अपने पिता के संरक्षित सदस्यों तक पहुंचने की अनुमति देता है जबकि पूर्व नहीं करता है। – bitmask

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