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

本文探讨了C++中虚函数、纯虚函数的作用及其实现机制,对比了虚函数与非虚函数的区别,并介绍了NVI手法(非虚接口)等替代方案。

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

转载于:https://www.cnblogs.com/lijinping/p/6069932.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值