转载:【C++】虚函数中的默认参数_Bob__yuan的博客-CSDN博客_虚函数的默认参数
重点:
《Effective C++ 改善程序与设计的55个具体做法》条款37写道:绝不重新定义继承而来的缺省参数值。
静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。
动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。
如图所示:
通常按以前所了解的是,基类指向派生类,如果是虚函数,则调用虚函数的内容。但是虚函数的默认参数是一个容易混淆的地方。
原因是编译器为了提高执行的效率,对虚函数中的默认参数采用了静态绑定的方法。
按照这个理解就是,编译器会在编译的时候将类型和函数的默认参数绑定,比如在
A virtual fun(int i=10)
B virtual fun(int i=20) //B的基类是A
A* a=new B() //相当于B对象继承了A中函数的默认参数 B fun(int i=10);
B* b =new B() //相当于B对象继承了B中函数的默认参数 B fun(int i=20);
如果虚函数中有默认的参数,则会根据其类型确定调用该类型的默认参数。