2009-01-25 13 views
7

मैं अपने बेस क्लास में संरक्षित फ़ंक्शन को कॉल नहीं कर सकता। क्यूं कर? यह इस तरह दिखता है:बेस क्लास संरक्षित कार्यों को कॉल नहीं कर सकता है?

class B : B2 
{ 
public: 
    virtual f1(B*)=0; 
protected: 
    virtual f2(B*) { codehere(); } 
} 
class D : public B 
{ 
public: 
    virtual f1(B*b) { return f2(b); } 
protected: 
    virtual f2(B*b) { return b->f2(this); } 
} 

MSVC में मैं त्रुटि त्रुटि C2248 मिलती है: 'नाम :: वर्ग :: f2': संरक्षित सदस्य वर्ग 'नाम :: वर्ग'

में घोषित उपयोग नहीं कर सकते जीसीसी मुझे त्रुटि मिलती है: 'आभासी int name :: class :: f2()' संरक्षित है।

वह क्यों है? मैंने सोचा कि संरक्षित सदस्यों का बिंदु कॉल करने के लिए व्युत्पन्न कक्षाओं के लिए है।

+0

कम से कम कोड जोड़ें जो त्रुटियों को संकलित और उत्पन्न करेगा जो आप हमें ठीक करना चाहते हैं। उपरोक्त कोड में कई अन्य वाक्यविन्यास त्रुटियां हैं जो आपकी समस्या को हल करने से परेशान हो जाती हैं। –

+0

मैं मार्टिन से सहमत हूं। यदि आप चाहते हैं कि हम आपकी मदद करें, तो अपना कोड सी ++ (वापसी प्रकार, अर्धविराम और अन्य सामान को छोड़कर) में कुछ समय निवेश करें –

उत्तर

15

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

तो

virtual f1(B*b) { return f2(b); } 

क्योंकि f2 वर्ग पर ही चल रही है, ठीक है। (अंदर कहा जाता है)

लेकिन

virtual f2(B*b) { return b->f2(this); } 

संकलन नहीं होगा, क्योंकि f2 ख नहीं वर्ग डी पर ही चल रही है। (बाहर कहा जाता है) यह अवैध है।

इसे ठीक करने के लिए बी :: एफ 2 सार्वजनिक होना चाहिए।

+0

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

+0

जॉन, या तो बी 2 सार्वजनिक बनाते हैं या डी को बी के मित्र होने की घोषणा करते हैं। मुझे किसी अन्य तरीके से अवगत नहीं है। – OldPeculier

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