禁止虛函數使用缺省參數值


在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;
};

  

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM