博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ ------- virtual
阅读量:6137 次
发布时间:2019-06-21

本文共 844 字,大约阅读时间需要 2 分钟。

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

你可能感兴趣的文章
MySQL表新增字段默认值处理的一处小细节
查看>>
MEMCACHE TIME_WAIT过多的解决方法
查看>>
CITRIX技术峰会,浦东香格里拉之旅
查看>>
预测地震
查看>>
2015年创业中遇到的技术问题:111-120
查看>>
Flink流作业模式(参考)
查看>>
单元测试——业务层单元测试
查看>>
docker之高级网络配置
查看>>
通过MMM构建MYSQL高可用集群系统
查看>>
英语四六级暴力查询成绩脚本(忘记准考证的同学的好东西)
查看>>
基于keepalived实现mariadb的高可用
查看>>
impdp expdp nls_lang字符集设置
查看>>
php安装扩展错误:Cannot find config.m4
查看>>
一个综合的分布式项目之性能测试
查看>>
Laravel4 控制器放到子文件夹
查看>>
2015.3.27 Linux文档的压缩和打包
查看>>
自定义的python目录和文件 import 找不到路径的解决办法
查看>>
[Swift]UIKit学习之UILabel的用法
查看>>
zabbix 基本键值
查看>>
我的友情链接
查看>>