सी ++ में, बेस क्लास का सदस्य फ़ंक्शन उसी नाम, के व्युत्पन्न क्लास फ़ंक्शन द्वारा ओवरराइड किया जाएगा, भले ही इसका प्रोटोटाइप (पैरामीटर 'गिनती, प्रकार और स्थिरता) अलग हो? मुझे लगता है कि यह एक मूर्ख सवाल है, क्योंकि कई वेबसाइटें कहती हैं कि ऐसा होने के लिए फ़ंक्शन प्रोटोटाइप समान होना चाहिए; लेकिन नीचे कोड संकलित क्यों नहीं करता है? विरासत का यह एक बहुत ही साधारण मामला है, मुझे विश्वास है।सी ++ विरासत और फ़ंक्शन ओवरराइडिंग
#include <iostream>
using std::cout;
using std::endl;
class A {};
class B {};
class X
{
public:
void spray(A&)
{
cout << "Class A" << endl;
}
};
class Y : public X
{
public:
void spray(B&)
{
cout << "Class B" << endl;
}
};
int main()
{
A a;
B b;
Y y;
y.spray(a);
y.spray(b);
return 0;
}
जीसीसी फेंकता
error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
सी ++ एफएक्यू जो एक ही मुद्दे के बारे में कहता है, एक विस्तृत स्पष्टीकरण के लिए अगर किसी को इसकी आवश्यकता होती है :) http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq- 23.9 – legends2k
यह कहना थोड़ा मुश्किल है कि हस्ताक्षर समान होना चाहिए। हस्ताक्षर नाम मैंगलिंग और लिंकिंग के लिए आधार हैं। अलग-अलग वर्गों के दो सदस्यों के पास अलग-अलग हस्ताक्षर होते हैं, भले ही कोई दूसरे को ओवरराइड करता हो। यह कहना बेहतर है कि "समान पैरामीटर प्रकार, नाम और स्थिरता", मुझे लगता है, भले ही यह कहने में लंबा समय हो। –
@ लिटब: स्पष्टीकरण के लिए धन्यवाद! मुझे लगता है कि 'प्रोटोटाइप' यहां उपयुक्त शब्द है, मैंने इसे प्रश्न में बदल दिया है :) – legends2k