32.public继承应该是 is a 继承关系。试用与base class的每一件事也适用于 derived class,因为每一个derived class 都是一个 base class
33.当我们继承base class并加上重载函数,而又希望重新定义或者复写其中一部分,必须为原来那些在base classs 中被遮掩的成分引入一个using 声明。
34.接口继承和实现继承不同,在Public继承下,derived class总是继承接口。
纯虚函数总是只具体制定接口继承。
(非纯)虚函数指定接口继承以及缺省的实现继承
非虚函数制定接口继承以及强制性实现继承。
35. 考虑虚函数以外的选择:
NVI手法:让public non-virtual成员函数调用private virtual 函数。优点是可以在非虚函数中提前设定适当场景,并在调用结束后清理。
由函数指针实现strategy模式,用函数指针来做构造函数参数。
由tr1::function完成strategy,好处是函数更加泛化,可以调用外部函数,函数对象,别的类的成员函数来做参数
古典的strategy模式就是把类都做继承,然后类和类之间做复合。(一个类包含了另一个的对象实体)
这样每个继承类也都有独特的方法。
36.不要重新定义继承来的非虚函数。非虚函数为静态绑定,public继承应该是 is a 关系,所以每个派生类一定会继承接口和实现
如果一个基类指针被指向的派生类对象,还是会调用基类的非虚函数。而虚函数则取决于它指向的具体对象
37.不药重新定义继承而来的虚函数的缺省参数。
因为函数是虚继承的,动态绑定的,而参数是静态绑定的。
那每次都要写同样的缺省参数值,改起来也很麻烦,可以参考NVI手法
38.复合是一个has a 或者 is implemented in terms of 的关系
39.小心使用private继承,它也是 is implemented in terms of 的关系
也用可以复合关系来实现,但是当需要访问报数成员或者重新定义虚函数时,可以考虑Private继承
和复合不一样,Private可以造成empty base class 最优化。(真正的空间大小为0)