यह एक बुरा विचार है, क्योंकि आपको मिलने वाले डिफ़ॉल्ट तर्क स्थिर प्रकार की वस्तु पर निर्भर करते हैं , जबकि virtual
फ़ंक्शन को प्रेषित करने के लिए गतिशील पर निर्भर करेगा प्रकार ।
यह कहना है, जब आप किसी फ़ंक्शन को डिफ़ॉल्ट तर्कों के साथ कॉल करते हैं, तो डिफ़ॉल्ट तर्कों को संकलन समय पर प्रतिस्थापित किया जाता है, भले ही फ़ंक्शन क्या हो virtual
या न हो।
@cppcoder ने अपने [बंद] प्रश्न में निम्नलिखित उदाहरण प्रस्तुत किया :
struct A {
virtual void display(int i = 5) { std::cout << "Base::" << i << "\n"; }
};
struct B : public A {
virtual void display(int i = 9) override { std::cout << "Derived::" << i << "\n"; }
};
int main()
{
A * a = new B();
a->display();
A* aa = new A();
aa->display();
B* bb = new B();
bb->display();
}
जो निम्नलिखित उत्पादन का उत्पादन करता है:
Derived::5
Base::5
Derived::9
उपरोक्त स्पष्टीकरण की सहायता से, यह देखना आसान है कि क्यों। संकलन के समय, संकलक स्थिर प्रकार के संकेत के सदस्य कार्यों से डिफ़ॉल्ट तर्कों को प्रतिस्थापित करता है, जिससे main
फ़ंक्शन निम्न के बराबर हो जाता है:
A * a = new B();
a->display(5);
A* aa = new A();
aa->display(5);
B* bb = new B();
bb->display(9);