चर्चा करते हुए एक और so questionनाम छुपा और आभासी कार्यों
कोड पर विचार करें के बारे में भ्रम की स्थिति:
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
// 1)
Derived * obj = new Derived ;
obj->gogo(7); // this is illegal because of name hiding
// 2)
Base* obj = new Derived ;
obj->gogo(7); // this is legal
}
मामले 2)
कॉल obj->gogo(7)
के लिए रन टाइम पर हल हो गई है।
चूंकि obj->gogo(7)
कानूनी है। ऐसा लगता है कि Derived
के vtable में पीआरआर virtual void gogo(int a)
शामिल है जो छुपा होना चाहिए था।
मेरे भ्रम की स्थिति है, क्योंकि नाम छुपा का कारण बनता है मामला 1) अवैध होने के लिए तो कैसे 2 में कॉल) रन टाइम पर
क) क्या व्युत्पन्न की vtable हल हो गई है पूर्णांक gogo के लिए() सूचक होता है।
बी) यदि ए) सत्य नहीं है, तो वर्चुअल फ़ंक्शंस के लिए कॉल रेज़ोल्यूशन बेस क्लास के vtable तक पहुंच जाता है।
@AndersK फ़ंक्शन 'बेस :: gogo (int)' वास्तव में 'व्युत्पन्न :: gogo (int *)' से छिपा हुआ है। लेकिन 'व्युत्पन्न' वर्ग में 'बेस :: gogo;' कथन का उपयोग करके इस विशेष समस्या को हल किया जाएगा। –
@ माइकल विल्ड हाँ, मैंने अपनी गलती देखी। –