2013-01-08 15 views
27

में फ़ंक्शन ओवरलोडिंग के साथ समस्या है, यह संभवतः एक नोब प्रश्न है, इसके बारे में खेद है। सी ++, फ़ंक्शन अधिभार और विरासत में कुछ उच्च स्तर की सामग्री के साथ गड़बड़ करने की कोशिश करते समय मुझे हाल ही में एक अजीब समस्या का सामना करना पड़ा।सी ++ समस्या विरासत वर्ग

मैं समस्या का प्रदर्शन करने के लिए एक साधारण उदाहरण दिखाऊंगा;

दो वर्ग, classA और classB नीचे दिए गए हैं;

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
}; 
मैं क्या पता classB अब दो func(..) काम करता है, अलग अलग तर्क की वजह से अतिभारित पास जाना चाहिए के अनुसार

लेकिन मुख्य विधि में इसे आजमाते समय;

int main(){ 
    int a; 
    char b[20]; 
    classB objB; 
    objB.func(a); //this one is fine 
    objB.func(b); //here's the problem! 
    return 0; 
} 

यह विधि void func(char[]){}; जो सुपर वर्ग, classA में है के रूप में त्रुटियों देता है, व्युत्पन्न वर्ग, classB पूर्णांक दिखाई नहीं देता है।

मैं इसे कैसे दूर कर सकता हूं? यह नहीं है कि सी ++ में ओवरलोडिंग कैसे काम करती है? मैं C++ के लिए नया हूं लेकिन जावा में, मुझे पता है कि मैं इस तरह कुछ उपयोग कर सकता हूं।

हालांकि मुझे पहले से ही this thread मिल गया है जो एक समान मुद्दों के बारे में पूछता है, मुझे लगता है कि दोनों मामले अलग हैं।

उत्तर

40

आपको बस एक using है:

class classB:public classA{ 
    public: 
     using classA::func; 
     void func(int){}; 
}; 

यह func के लिए आधार वर्ग खोज नहीं करता है, क्योंकि यह पहले से ही व्युत्पन्न वर्ग में एक मिल गया। using कथन अन्य अधिभार को उसी दायरे में लाता है ताकि वह ओवरलोड रिज़ॉल्यूशन में भाग ले सके।

9

यह अच्छी तरह से इस सवाल का जवाब में उदाहरण के लिए समझाया गया है:

Why should I use the "using" keyword to access my base class method?

संक्षेप में, संकलक भी जब, माता पिता के वर्गों से तरीकों से मेल खाते हैं जब यह वर्तमान कक्षा में मिलान विधि नाम पाता है के लिए खोज बंद हो जाएगा, वह विधि संगत नहीं है। मुझे लगता है कि यह कुछ स्वचालित प्रकार के रूपांतरणों को अधिक तर्कसंगत रूप से काम करने की अनुमति देता है, बिना कई माता-पिता वर्ग विधियों को ओवरराइड करने की आवश्यकता के।

+1

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

+0

@ अनीबिस, यह अधिभार संकल्प के लिए नियमों का सामान्य मामला है और सामान्य रूप से 'उपयोग' घोषणा का उद्देश्य है। – chris

3

यदि आप व्युत्पन्न कक्षा में किसी फ़ंक्शन के एक प्रकार को ओवरराइड करते हैं, तो आपको सभी प्रकारों को ओवरराइड करने की आवश्यकता है। आप या तो जेएलडेलो ने व्युत्पन्न कक्षा में फ़ंक्शन के संस्करण का सुझाव दिया या लिख ​​सकते हैं जो केवल उसी वर्ग के बेस क्लास के फ़ंक्शन को कॉल करता है।

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
     void func(char[]){}; 
}; 

void classB:func(char[] ch) 
{ 
    classA::func(ch); 
} 
-4

आप

objB.func(b); //here's the problem! 

BCS में प्रकार int के तर्क से गुजरना होगा यह पूर्णांक तर्क के साथ अतिभारित किया गया है

+0

आप एक और विस्तृत उत्तर देने का प्रयास कर सकते हैं। – easwee

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