结论:缺省参数是在编译期决定的。
示例代码:
class classA
{
public:
classA(){}
~classA(){}
virtual void print(int val = 1)
{
cout<<"from classA "<<val <<endl;
}
};
class classB: public classA
{
public:
classB(){}
~classB(){}
virtual void print(int val = 2)
{
cout<<"from classB "<<val <<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
classB b;
classA *pa = &b;
b.print();
pa->print();
classA a;
a.print();
return 0;
}
上述代码输出:
from classB 2
from classB 1
from classA 1
由于pa和b都是指向一个classB实例,因此运行时 会调用classB:print, 但缺省参数是在编译期决定的。
在编译时,pa被声明为classA类型的指针,因此会按照classA::print的声明把缺省参数设为1。
因此我们平时应该避免这种会导致意料之外的结果的写法,
《Effective C++》的第37条亦有论述:
绝不要重定义一个函数通过继承得到的缺省参数值。