आइए अवधारणा को आसानी से समझने के लिए C++ में एक नमूना प्रोग्राम पर विचार करें।
उदाहरण कोड
#include<iostream> using namespace std; class B { public: virtual void s(int a = 0) { cout<<" In Base \n"; } }; class D: public B { public: virtual void s(int a) { cout<<"In Derived, a="<<a; } }; int main(void) { D d; // क्लास D का एक ऑब्जेक्ट B *b= &d;// d को इंगित करने वाला B* टाइप का पॉइंटर b->s();// प्रिंट करता है "D::s() called" return 0; }
आउटपुट
In Derived, a = 0
इस आउटपुट में, हम देखते हैं कि डेराइव्ड क्लास का s() कॉल किया गया है और बेस क्लास के s() का डिफ़ॉल्ट मान उपयोग किया गया है।
डिफ़ॉल्ट आर्गुमेंट्स फ़ंक्शन के सिग्नेचर में भाग नहीं लेते। इसलिए बेस क्लास और डेराइव्ड क्लास में s() के सिग्नेचर समान माने जाते हैं, इसलिए बेस क्लास का s() ओवरराइड हो जाता है। डिफ़ॉल्ट मान कंपाइल टाइम पर उपयोग किया जाता है। जब कंपाइलर जांचता है कि फ़ंक्शन कॉल में एक आर्गुमेंट गायब है, तो यह दिए गए डिफ़ॉल्ट मान को प्रतिस्थापित करता है। इसलिए, उपरोक्त प्रोग्राम में, x का मान कंपाइल टाइम पर प्रतिस्थापित होता है, और रनटाइम पर डेराइव्ड क्लास का s() कॉल किया जाता है। a का मान कंपाइल टाइम पर प्रतिस्थापित होता है, और रनटाइम पर डेराइव्ड क्लास का s() कॉल किया जाता है।