#include<iostream>
using namespace std;
class Base
{
public:
virtual void g( int i = 10 )
{
cout << i << endl;
};
};
class Derived: public Base
{
public:
void g( int i = 20 )
{
cout << "Derived::g() " << i << endl;
}
};
int main()
{
Base* pb = new Derived;
pb->g();
delete pb;
return 0;
}
输出结果:
Derived::g() 10
Why?
C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了。
实参与形参的结合是从左至右顺序进行的,第1个实参必须与第1个形参结合,第2个实参必须与第2个形参结合……,因此指定默认值的参数必须放在形参表列中的最右端,否则出错。
声明函数时已对形参给出了默认值,而在定义函数时又对形参给出默认值,有的编译系统会给出“重复指定默认值”的报错信息,而有的编译系统对此不报错,甚至允许在声明时和定义时给出的默认值不同,此时编译系统以先遇到的为准。由于函数声明在函数定义之前,因此以声明时给出的默认值为准,而忽略定义函数时给出的默认值。
对于虚函数,编译系统将在编译时刻根据被调用函数的对象的类型决定默认形参的值。