在本原则中作者展开的出发点是在类的继承体系中的函数的继承,一般来讲从父类中你只能继承两种函数,一个是非virtual成员函数,一个是virtual成员函数。因为非virtual成员函数不存在重新定义的问题,所以有必要讨论的就只剩下virtual成员函数了。
在这里,你也一定要明白什么是静态绑定什么是动态绑定。静态绑定就是声明绑定,即决定于赋值符号左边那个类型;动态绑定是对象绑定,即赋值符号右边那个类型。
本原则要讨论的主要问题是,virtual成员函数属于动态绑定,但是当它带有缺省实参时,这个形参属于静态绑定。
那这又会怎么样呢?当你用下面这样的式子
Virtual成员函数本身属于动态绑定,它是Rectangle版本的,但是它的缺省实参却是Shape类型的,程序执行以后的结果就不是你想要的了。
那么C++为啥要采取这种机制呢?很简单,这是因为你如果在运行期决定缺省实参属于哪个类,必然会在运行期采取某种方法解决此问题,这比在编译器确定缺省实参的归属要慢得多,所以这是为了运行期的效率。
作者还提到如果你在父类中设置缺省值的集合,那么子类中的virtual函数就直接设置缺省实参,这样一来就增加了代码相依性,势必会造成一改全改,牵一发而动全身的惨状。
如果你因为使用virtual成员函数而遭遇苦恼,那就参照原则35去寻找一些替代方案吧。