2010-11-24 18 views
8

संभव डुप्लिकेट वारिस मैं कोई मिलता-जुलता समारोह मिलता है:
overloaded functions are hidden in derived classक्यों जब मैं इस समारोह

मैं क्लास ए और कक्षा बी (ए के उपवर्ग)

क्लास ए का कार्य

virtual void foo(int, int); 
virtual void foo(int, int, int); 

जब मैं जब मैं संकलक नहीं दूँगा मुझे क्योंकि यह कहते हैं

वर्ग के साथ foo (int, int, int) कॉल करने के लिए कोशिश समारोह

virtual void foo(int, int); 

साथ

कक्षा बी करने की कोशिश

no matching function for foo(int,int,int) 
candidate is foo(int,int); 
+0

अधिक कोड पोस्ट करें। –

+0

या कोई अन्य संभावित डुप्ली http://stackoverflow.com/questions/4146499/why-does-a-virtual-function-get-hidden है। सुनिश्चित नहीं है कि प्रश्नकर्ता उम्मीद करता है कि वर्चुअल होने वाले कार्य महत्वपूर्ण हैं, लेकिन इससे कोई फर्क नहीं पड़ता। –

उत्तर

9

कारण सी ++ नाम लुकअप और ओवरलोड रिज़ॉल्यूशन के तरीके से करना है। C++ अभिव्यक्ति प्रकार से शुरू होगा और ऊपर तक लुकअप करेगा जब तक कि यह निर्दिष्ट नाम से मेल खाता सदस्य न मिले। इसके बाद वह उस नाम के साथ सदस्य के ओवरलोड को खोजे गए प्रकार में मानेंगे। इसलिए इस परिदृश्य में यह केवल foo विधियों को B में घोषित किया गया है और इसलिए अधिभार को खोजने में विफल रहता है।

सबसे आसान उपाय में जोड़ने के लिए संकलक को उन अधिभारों पर विचार करने के लिए मजबूर करने के लिए है।

class B : public A { 
    using A::foo; 
    virtual void foo(int, int); 
}; 
2

कक्षा बी में ओवरराइड उसी नाम के साथ कक्षा ए के तरीकों को छुपाता है। (अधिकांश compilers छिपा आभासी तरीकों के बारे में चेतावनी दी है आप पर संकलक चेतावनी है?।)

इससे बचने के लिए, वर्ग बी (जो कुछ भी public/protected/private अनुभाग उचित है) करने के लिए

using A::foo; 

जोड़ें।

1

उपयोग

B b; 
b.A::foo(1,2,3); 
उदाहरण के लिए

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