C++中 虛函數中的默認參數問題

原文轉自nwplei的博客
當通過指針調用一個對象的方法時,如果該方法是虛函數,則實際調用的是該實例的方法。

當缺省參數和虛函數一起出現的時候到底用哪個默認值呢?虛函數是動態綁定的,但是爲了執行效率,缺省參數是靜態綁定的。
也就是 指針是哪種類型,就調用該類型對應的類中,該函數定義時的缺省值。

#include <iostream>
using namespace std;
class A
{
public:
    virtual void out(int i = 1)
    {
        cout << "class A  " << i <<endl;
    }
};
class B : public A
{
public:
    virtual void out(int i = 2)
    {
        cout  <<"class B " <<i <<endl;
    }

};
int main()
{
    A a;
    B b;
    A * p = &a;

    p->out();
    p->out(3);
    p = &b;
    p->out();
    p->out(4);

    return 0;
}

由上可知pa->out()和pa->out(3)調用都是函數A::out(int i),
由上可知pb->out()和pb->out(4)調用都是函數B::out(int i),

缺省參數是靜態綁定的,pb->out()時,pb的靜態類型是A*,它的缺省參數是1;但是調用的是B::out(int i)
編寫代碼驗證了一下,正確。
對於這個特性,估計沒有人會喜歡。所以,永遠記住:“絕不重新定義繼承而來的缺省參數(Never redefine function’s inherited default parameters value.)”
上面得輸出如下
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章