轉自:http://blog.csdn.net/zjq2008wd/article/details/18559871#comments
#include<iostream>
using namespace std;
class Base{
public:
virtual void show(int i=10){
cout<<"Base show i="<<i<<endl;
}
virtual ~Base(){}
};
class Derived:public Base{
public:
virtual void show(int i=20){
cout<<"Derived show i="<<i<<endl;
}
virtual ~Derived(){}
};
int main(){
Base* bp=new Derived();
bp->show();
}
輸出:Derived show i=10
知識點:指派相容,多态,預設參數的靜态綁定
bp->show(); 調用的是derived的虛函數,但是c++的預設參數是靜态綁定(根據靜态類型決定)的,是以傳進來的是base的預設參數。
參見C++primer第4版 p482
深入了解,其實這就是違背違背 Effective C++的條款37:絕不重新定義繼承而來的預設參數值 的後果,還有一點需要注意,如果父類中的虛函數給出預設參數,而子類中的相應函數沒有預設參數,那麼如果通過子類對象(不是引用或指針)來通路該函數的話,必須指定實參。