在C++中,虛函數是動態綁定的,但函數的缺省參數卻是在編譯時就靜態綁定的。這意味着你最終執行的函數是一個定義在派生類,但使用了基類中的缺省參數值的虛函數。為了避免虛函數重載時,因參數聲明不一致給使用者帶來的困惑和由此導致的問題,規定所有虛函數均不允許聲明缺省參數值。
示例:虛函數display缺省參數值text是由編譯時刻決定的,而非運行時刻,沒有達到多態的目的:
class Base { public: virtual void Display(const std::string& text = "Base!") { std::cout << "Base:" << text << std::endl; } virtual ~Base(){} }; class Sub : public Base { public: virtual void Display(const std::string& text = "Sub!") { std::cout << "Sub:" << text << std::endl; } virtual ~Sub(){} }; int main() { Base* base = new Sub(); Sub* sub = new Sub(); ... base->Display(); // 程序輸出結果: Base! 而期望輸出:Sub! sub->Display(); // 程序輸出結果: Sub! delete base; delete sub; return 0; };
解釋如下:虛函數是動態綁定的(即在運行時),但缺省參數是靜態綁定的(即在編譯時),默認參數在編譯的時候已經寫死了,不會動態的。
這意味着你
最終調用的是一個定義在派生類,但使用了基類中的缺省參數值的虛函數。
原因:

可能大家會說為什么不讓缺省參數值被動態綁定呢?
答案和運行效率有關。如果缺省參數值被動態綁定,編譯器就必須想辦法為虛函數在運行時確定合適的缺省值,這將比現在采用的在編譯階段確定缺省值的機制更慢更復雜。做出這種選擇是想求得速度上的提高和實現上的簡便,所以大家現在才能感受得到程序運行的高效。