Effective C++ ------- virtual

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等替代方案。

posted @ 2016-11-16 16:00  navas  阅读(141)  评论(0编辑  收藏  举报