2011-08-10 6 views
5

इस कोड को देखते हुए:बेस क्लास से छुपा ओवरलोडिंग का पर्दाफाश कैसे करें?

class base { 
public: 
    string foo() const; // Want this to be visible in 'derived' class. 
} 

class derived : public base { 
public: 
    virtual int foo(int) const; // Causes base class foo() to be hidden. 
} 

मैं आधार :: foo() को बेस क्लास को कॉल करने वाले डमी विधि अधिभार के साथ प्रतिलिपि किए बिना व्युत्पन्न करने के लिए दृश्यमान कैसे बना सकता हूं? क्या using चाल करता है, यदि हां, तो यह कहां जाता है, क्या यह ऐसा है?

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
} 

उत्तर

4

संक्षिप्त उत्तर के लिए खेद है, लेकिन हाँ। यह इस तरह वास्तव में है और करता है कि आप क्या चाहते:

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
}; 

भी ध्यान रखें कि आप भी using बिना आधार पहुंच सकता है: के दायरे के आधार दिखाई से

derived x; 
string str = x.base::foo(); // works without using 
+0

मुझे लगता है कि यह पॉइंटर्स के लिए भी काम करता है: x_ptr-> base :: foo(), है ना? – WilliamKF

+0

@ विलियम: हाँ। दोनों के बीच का अंतर यह है कि 'उपयोग' उस नाम के सभी सदस्यों को एक ही दायरे में खींचता है, इसलिए वे सभी ओवरलोड रिज़ॉल्यूशन में भाग लेते हैं। – ybungalobill

1

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

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