转自: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:绝不重新定义继承而来的缺省参数值 的后果,还有一点需要注意,如果父类中的虚函数给出默认参数,而子类中的相应函数没有默认参数,那么如果通过子类对象(不是引用或指针)来访问该函数的话,必须指定实参。