一个简单的形参赋值有关问题,其他大神门给个解释

一个简单的形参赋值问题,其他大神门给个解释
不太明白其中的原理,请解释下。我直接上代码了

class base
{
   void func(int i = 10){printf("value = %d \n", i);};
}

class child:public base
{
   void func(int i = 20){printf("value = %d \n", i);};
}

void main()
{
   base* pTmp = new child();
   pTmp->func();
}

为什么输出结果是: value = 10 , 按理来讲 应该是执行child类的func, 为何输出却是10,而非20?
形参赋值 重写接口

------解决方案--------------------
因为不是virtual函数,所以直接调用基类的版本。基类版本默认参数是10,所以输出10。
即使在void func之前加入virtual关键字结果也不是20。因为默认参数是在编译期间由编译器自动加上的,编译器选择的时候,看到的是基类的默认参数值,所以即使调用子类的版本(加virtual之后),结果还是10。
------解决方案--------------------
1.函数不是虚函数
2.即使是虚函数,缺省参数是静态绑定的,在调用处传递的还是10