C++虚函数的使用。一个代码

#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