public继承意味着is-a(是一种),所以对base class为真的任何事情
一定也对其derived class为真。
1 pure virtual 函数必须被任何继承了他们的子类实现,通常它们在抽象
类中没有定义,结合两者,我们发现,声明一个纯虚函数的目的是为了
让派生类只继承函数接口。
2 声明非纯impure virtual函数的目的,是让派生类继承其接口以及一份默认
实现。
(此处飞机的A,B,C例子,C可能不想用默认行为,但是缺省就用了,
对此可以利用纯虚函数+实现,子类里如果想用默认行为,则显示调用
base::purevirtual_func() )
3 声明非虚函数的目的是让派生类继承函数的接口和一份强制性实现。
class定义内出现函数实现,则暗自成了inline。
替代虚函数:
NVI手法(non virtual interface,基类里声明一个non virtual函数,但是它
调用private的virtual函数,各子类实现自己的virtual函数。也叫template method
设计模式, 这个non virtual函数可以控制调用virtual函数之前的准备工作,加锁
之类的,也可以做virtual函数调用后的释放、清理工作)
运用函数指针给每个对象(对象持有函数指针成员),其优点是每个对象的处理
函数都可以不同,也可以在运行期改变计算函数(setCalcFunc),其缺点是会
降低类的封装性(读取类的成员变量)
绝不要重新定义继承而来的non-virtual函数,析构函数就是一个特别的例子。
条款37: 绝不要重新定义一个继承来的缺省参数值,因为缺省参数值都是
静态绑定,而virtual函数---你唯一应该覆写的东西---却是动态绑定的。
当出现这种使用virtual遇到麻烦时,可以考虑上述的NVI等替代方案。