在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;
};
解釋如下:虛函數是動態綁定的(即在運行時),但缺省參數是靜態綁定的(即在編譯時),默認參數在編譯的時候已經寫死了,不會動態的。
這意味着你
最終調用的是一個定義在派生類,但使用了基類中的缺省參數值的虛函數。
原因:
可能大家會說為什么不讓缺省參數值被動態綁定呢?
答案和運行效率有關。如果缺省參數值被動態綁定,編譯器就必須想辦法為虛函數在運行時確定合適的缺省值,這將比現在采用的在編譯階段確定缺省值的機制更慢更復雜。做出這種選擇是想求得速度上的提高和實現上的簡便,所以大家現在才能感受得到程序運行的高效。
