一切皆因虚函数的默认参数而起。当基类的虚函数中参数默认值与派生类中相应函数的参数默认值不相同时会发生什么样的情况?看下代码:
基类
class BASE
{
virtual void f(int i=0);
};
派生类
class A : public BASE
{
virtual void f(int i=1);
};
伪代码
BASE *p = new A();
p->f();
代码到此结束,那么此处 f 函数中的参数的默认值是多少呢?可以肯定的说:非 0 即 1 。可是编译器不会这样回答,它需要制定明确的值,有点扯远了。我们可以根据代码分析, p 的静态绑定类型是 BASE,动态类型是 A,调用哪个类的虚函数是根据动态类型来决定的,说到这里有点眉目了吗?接着看,函数的默认值是静态绑定的时候确定的,所以到这里可以得出答案,此处的 f 函数是类 A 中的 f,但是 f 中参数的默认值却是 BASE 类中 f 函数的默认值。我们前面判断也没有说错。确实是:非 0 即 1 。