举个栗子
#include <iostream>
class Base {
public:
virtual ~Base() = default;
virtual void Fun(int number = 10) {
std::cout << "Base::Fun number " << number << std::endl;
}
};
class Derive : public Base {
public:
void Fun(int number = 20) override {
std::cout << "Derive::Fun number " << number << std::endl;
}
};
int main() {
Base *p = new Derive;
p->Fun();
delete p;
Derive *pd = new Derive;
pd->Fun();
delete pd;
return 0;
}
运行结果
Derive::Fun number 10
Derive::Fun number 20
原因
虚函数是动态绑定,运行期可以调用派生类行为;而缺省参数值是静态绑定,编译时候就已经确定了。
为什么这样实现?
为了效率。如果缺省值是动态绑定的,编译器就必须有某种方法在运行期为 virtual 函数决定适当的缺省值。这比目前实行的 “在编译期决定” 的机制更慢且更复杂。为了程序的执行速度和编译器实现上的简易度, c++选择了这样的实现方式,就是为了高执行效率。
结论
Effective C++条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)