2011-03-09 11 views
7

यह एक साक्षात्कार प्रश्न है। मैं एक सी ++ विशेषज्ञ अभी तक तो मैं इस सवाल का जवाब खोजने में कुछ मदद की जरूरत है नहीं कर रहा हूँ (मैं पहला सवाल को समझने के लिए चाहते हैं ... यह एक वैध सवाल है?)सी ++: सुपरक्लास 'विधियों को चुनिंदा रूप से एक्सेस प्रतिबंधित करें?

प्रश्न:

मान लीजिए मेरे पास कक्षा बी से प्राप्त हुआ है और मैं कुछ का पुन: उपयोग करना चाहता हूं, लेकिन ए के सभी तरीकों से नहीं, मैं सुपरक्लास 'विधियों को चुनिंदा रूप से कैसे प्रतिबंधित करूं?

धन्यवाद!

+0

आप शायद इसका मतलब है कि * ** *** के तरीकों के कुछ ... का पुन: उपयोग करना चाहते हैं। –

+0

हाँ .. मैंने सुधार किया है .. धन्यवाद .. – maxpayne

उत्तर

10

मुझे लगता है कि

  1. आप A
  2. की परिभाषा आप चुनना होगा जिसमें A से तरीकों एक B वस्तु से सुलभ होना चाहिए चाहते हैं बदल नहीं सकते।

using निर्देश आपकी समस्या हल करता है। उदाहरण:

class A 
{ 
public: // or protected for that matter 
    void foo(); 
    void bar(); 
}; 

class B : private A // or protected, depending on whether 
        // you want subclasses of B to expose 
        // some methods from A themselves 
{ 
public: 
    using A::foo; 
}; 

वर्ग B से foo प्रयोग करने योग्य है, लेकिन नहीं bar बनाता है। लेकिन एक चेतावनी के रूप में, ध्यान दें कि using A::foofoo के सभी ओवरलोड का पर्दाफाश करेगा।

+1

यह एक अच्छा समाधान है, दिए गए प्रश्न को पूरा करना। हालांकि, यह ध्यान दिया जाना चाहिए कि कक्षा बी विरासत पदानुक्रम से पूरी तरह से अलग है, इसलिए "बी objB; ए * पीआरटीए = &objB;" जैसे कुछ करना संभव नहीं है। AFAIK, इस सवाल के लिए कोई पूरी तरह से संतोषजनक समाधान नहीं है। – Baltasarq

+0

@ बाल्टसरक: 'ए' के तरीकों को सीमित करने का क्या मतलब है यदि आप उन्हें एक बेयर पॉइंटर के माध्यम से' ए 'तक एक्सेस कर सकते हैं? याद रखें कि निजी विरासत ** ** ** "एक" संबंध नहीं है। यह केवल "सामान्य" सार्वजनिक विरासत से दूरस्थ रूप से संबंधित है, और इसे एक रचना उपकरण के रूप में देखा जाना चाहिए। –

+0

क्या आप समझा सकते हैं "लेकिन एक चेतावनी के रूप में, ध्यान दें कि ए :: फू का उपयोग करने से foo के सभी ओवरलोड का खुलासा होगा"? – maxpayne

3

वे जो उत्तर शायद सुनना चाहते हैं वह यह है कि आप आधार वर्ग के protected अनुभाग में पुन: उपयोग करने के तरीकों को दोबारा उपयोग कर सकते हैं, जो विधियों को व्युत्पन्न कक्षाओं में दिखाई नहीं देनी चाहिए उन्हें private अनुभाग में जाना चाहिए।

हालांकि, एक कदम पीछे लेना, आप यह इंगित करके अतिरिक्त अंक प्राप्त करने में सक्षम हो सकते हैं कि फ़ंक्शन का उपयोग करने के लिए कोड का पुन: उपयोग करने के लिए बेहतर उपाय हो सकते हैं (जैसे कि मुक्त फ़ंक्शंस का उपयोग करना जो कि दिखाई नहीं दे रहे हैं शीर्ष लेख फ़ाइल)।

+0

मुफ्त फ़ंक्शंस क्या हैं? – maxpayne

+0

@ मैक्सपेन: सादा वेनिला फ़ंक्शन, यानी। फ़ंक्शंस जो सदस्य फ़ंक्शन नहीं हैं ("विधियों") –

+0

जबकि आपका समाधान वास्तव में सरल और साफ है ... मुझे लगता है कि अगर कोई कक्षा ए में कोड बदलने की अनुमति नहीं है तो यह नहीं होगा .. – maxpayne

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