38、绝对不要重新定义继承而来的缺省参数值
1、缺省参数值的静态绑定
虚拟函数是动态绑定的,非虚拟函数是静态绑定的。
对于非虚拟函数,绝对不应该重新定义,见Effective_C++:37https://blog.csdn.net/l1dian11/article/details/81603168。
对于虚拟函数,由于函数的缺省参数值是静态绑定的,即通过指针调用函数时缺省参数值由指针的声明型别决定,而指针调用的函数是由指针指向的对象的型别来决定。考虑用一个指向派生类对象的基类指针来调用某个虚拟函数,即是调用派生类的函数却赋予其基类函数的缺省参数值。此时,这肯定不是我们期望的结果。
2、不要重新定义继承而来的缺省参数值
缺省参数值的静态绑定使得调用虚拟函数时,出现基类函数的缺省参数值与派生类函数的奇怪组合。因此,一种方法是绝对不要重新定义继承而来的缺省参数值,使得这个组合与派生类函数及其缺省参数值的组合一致。而让缺省参数值也施行动态绑定,同样可以解决问题,然而这种方法慢且复杂,被编译器放弃。