This मूल रूप से हर्ब Sutter की किताब Exceptional C++
में Item 21. Overriding Virtual Functions
में दिए गए उदाहरण से एक प्रति है।फ़ंक्शन ओवरलोडिंग के साथ उसे क्या करना है?
#include <iostream>
#include <complex>
using namespace std;
class Base
{
public:
virtual void f(int);
virtual void f(double);
virtual ~Base() {};
};
void Base::f(int) { cout << "Base::f(int)" << endl; }
void Base::f(double) { cout << "Base::f(double)" << endl; }
class Derived: public Base {
public:
void f(complex<double>);
};
void Derived::f(complex<double>) { cout << "Derived::f(complex)" << endl; }
int main()
{
Base* pb = new Derived;
pb->f(1.0);
delete pb;
}
कोड प्रिंट Base::f(double)
और मैं उस के साथ कोई समस्या नहीं। (मेरा जोर है) लेकिन मैं स्पष्टीकरण पेज 122 की चोटी पर लेखक द्वारा दिए गए समझ नहीं सके:
दिलचस्प है, भले ही बेस * PB एक व्युत्पन्न वस्तु की ओर इशारा करते है, यह कहता है आधार: : च (डबल), अधिभार संकल्प स्थिर प्रकार (यहां बेस) पर किया, नहीं गतिशील प्रकार है, क्योंकि (यहाँ व्युत्पन्न)।
मेरे समझ है कि कॉल pb->f(1.0)
एक आभासी कॉल और Base::f(double)
Derived
में f(double)
के लिए अंतिम overrider है। फ़ंक्शन ओवरलोडिंग के साथ उसे क्या करना है? जबकि अधिक भार संकल्प कॉल के प्रभावित करता है एक विशेषता है
पीबी को 'व्युत्पन्न *' में बदलें और देखें कि क्या होगा। – dlf
@ डीएलएफ: और संकलक चेतावनी भी देता है :-) – Jarod42
यह शीर्षक बहुत उपयोगी नहीं है। कल्पना करें कि अगर आप इसे खोज परिणामों में देखते हैं तो आप क्या सोचेंगे। –