原文轉自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.)”
上面得輸出如下