2017-11-28 57 views
18

में अनुमति दी मैं निजी विरासत का उपयोग कर रहा है, और मुझे लगता है कि किसी भी आधार वस्तु के व्युत्पन्न वर्ग उपयोग की अनुमति नहीं है देख कर हैरान हूँ।आधार वस्तु का कोई उपयोग निजी वंशानुक्रम

class A; 
class B : private A; 
class C : public B; 

C::method_1() 
{ 
    A* a; // Temporary "A" object for local computation 
} 

इसका विरासत से कोई लेना देना नहीं है। मैं किसी भी this->base method तक नहीं पहुंचना चाहता हूं!

यह कॉन्फ़िगरेशन विजुअल स्टूडियो ("ए 'पहुंच योग्य नहीं है, क्योंकि' बी '' ए 'से प्राप्त करने के लिए' निजी 'का उपयोग' निजी '' में एक सी 2247 त्रुटि प्रदान करता है)।

+9

कोशिश ':: ए * एक;' 'बजाय एक के * एक;' –

+3

संभव डुप्लिकेट [एक निजी बेस क्लास से स्थिर विधि कैसे कॉल करें?] (https://stackoverflow.com/questions/39349998/how-to-call-a-static-method-from-a-private-base-class) –

उत्तर

23

बदलें इस:

A* a; 
इस के लिए

: B से

::A* a; 

C के बाद से इनहेरिट करती है, और BA से, इस प्रकार आप चाल करने के लिए गुंजाइश संकल्प ऑपरेटर की जरूरत है।

कक्षा के माता-पिता को शामिल करने वाले स्थानीय दायरे में शुरू करने के बजाय, ::A:: की वजह से वैश्विक दायरे को देखना शुरू कर देता है।

Standard से

:

11.1.5 Acess विनिर्देशक

एक व्युत्पन्न वर्ग में, एक आधार वर्ग नाम की देखने इंजेक्शन श्रेणी नाम के बजाय नाम का मिलेगा दायरे में बेस क्लास जिसमें इसे घोषित किया गया था। इंजेक्शन-क्लास-नाम कम उस दायरे में बेस क्लास के नाम से सुलभ हो सकता है जिसमें घोषित किया गया था।

+0

मैं वास्तव में उस मामले में स्कोप ऑपरेटर की मेनिंग को समझ नहीं पा रहा हूं लेकिन यह ठीक काम करता है। धन्यवाद ! –

+1

@ गुइलाउमडेस्पेन: स्थानीय दायरे में शुरू करने के बजाय जिसमें कक्षा माता-पिता शामिल हैं, ':: ए' '::' की वजह से वैश्विक दायरे को देखना शुरू कर देता है। –

+1

आईएसओ: 11।1 एक्सेस विनिर्देशक: [नोट: व्युत्पन्न कक्षा में, बेस क्लास नाम की लुकअप नामांकितहेबेस क्लासिंटशेस्कोपिनविचिटवास्डेक्लेक्ड के बजाय इंजेक्शन-क्लास-नाम को प्राप्त करेगी। आधार वर्ग के नाम से इंजेक्शन-क्लास-नाममात्र अविश्वसनीय, जिसमें इसे घोषित किया गया था। -जेंड नोट] एक ही उदाहरण है –

15

आईएसओ सी ++: 11.1 पहुँच विनिर्देशक

5 [ध्यान दें: एक व्युत्पन्न वर्ग में, एक आधार वर्ग नाम की देखने आधार वर्ग के नाम के बजाय फाई एन डी इंजेक्शन श्रेणी नाम होगा जिस दायरे में इसे घोषित किया गया था। इंजेक्शन-क्लास-नाम बेस क्लास के नाम से कम पहुंच योग्य हो सकता है जिसमें इसे घोषित किया गया था। अंत टिप्पणी]

और मानक से उदाहरण:

class A { }; 
class B : private A { }; 
class C : public B { 
    A* p; // error: injected-class-name A is inaccessible 
    ::A* q; // OK 
}; 

N3797 Working Draft, Standard for Programming Language C++

+1

यदि ये कक्षाएं कुछ घोंसला वाले नामस्थान में हैं तो यह परेशान हो सकती है –

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