มาพิจารณาโปรแกรมตัวอย่างใน 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; // An object of class D B *b= &d;// A pointer of type B* pointing to d b->s();// prints"D::s() called" return 0; }
ผลลัพธ์
In Derived, a = 0
จากผลลัพธ์นี้ เราสังเกตเห็นว่า s() ของคลาสลูกถูกเรียก และค่าเริ่มต้นของ s() ของคลาสฐานถูกใช้
อาร์กิวเมนต์เริ่มต้น (Default arguments) ไม่ได้มีส่วนร่วมในลายเซ็นของฟังก์ชัน ดังนั้น ลายเซ็นของ s() ในคลาสฐานและคลาสลูกจึงถือว่าเหมือนกัน ดังนั้น s() ของคลาสฐานจึงถูกโอเวอร์ไรด์ (overridden) ค่าเริ่มต้นจะถูกใช้ในขณะคอมไพล์ไทม์ (compile time) เมื่อคอมไพเลอร์ตรวจสอบว่ามีอาร์กิวเมนต์หายไปในการเรียกฟังก์ชัน มันจะแทนที่ด้วยค่าเริ่มต้นที่กำหนด ดังนั้น ในโปรแกรมข้างต้น ค่าของ x จะถูกแทนที่ในขณะคอมไพล์ไทม์ และในขณะรันไทม์ (run time) s() ของคลาสลูกจะถูกเรียก ค่าของ a ถูกแทนที่ในขณะคอมไพล์ไทม์ และในขณะรันไทม์ s() ของคลาสลูกจะถูกเรียก