#include <iostream>
using namespace std;
class Base{
public:
Base(){}
virtual void g(int i=10){
cout<<"Base::g()"<<i<<endl;
}
};
class Derived : public Base{
public:
Derived(){}
void g(int i = 20){
cout<<"Derived::g()"<<i<<endl;
}
};
int main() {
Base *pb = new Derived;
pb->g();
return 0;
}
输出
Derived::g()10
为什么不是Derived::g()20???
参考https://blog.csdn.net/zhuimengzh/article/details/6787682
默认参数是不会做为判断函数是否相同的因素的。所以子类与基类中的g()函数被认为是相同的,这样基类的g()函数被隐藏了。另外,默认值是在编译期间使用的。当编译器看到一个函数调用中的某个参数缺失了,它就会用默认提供的值来替换。因此,上面程序中,i的值在编译期间被替换了,在运行时期间调用的是子类的g()函数。所以输出是Derived::g()10而不是Derived::g()20