Hãy xem xét chương trình mẫu C++ sau để dễ hiểu khái niệm:
Mã ví dụ
#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;
B *b = &d;
b->s();
return 0;
}
Kết quả đầu ra
In Derived, a = 0
Trong kết quả này, chúng ta quan sát thấy rằng, s() của lớp dẫn xuất được gọi và giá trị mặc định của s() lớp cơ sở được sử dụng.
Tham số mặc định không tham gia vào chữ ký hàm (function signature). Do đó, chữ ký của s() trong lớp cơ sở và lớp dẫn xuất được coi là giống nhau, nên s() của lớp cơ sở bị ghi đè (overridden). Giá trị mặc định được sử dụng tại thời gian biên dịch. Khi trình biên dịch kiểm tra thấy thiếu đối số trong lời gọi hàm, nó thay thế giá trị mặc định đã cho. Do đó, trong chương trình trên, giá trị của x được thay thế tại thời gian biên dịch, và tại runtime, s() của lớp dẫn xuất được gọi. Giá trị của a được thay thế tại compile time, và tại run time s() của lớp dẫn xuất được gọi.