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

Effective C++ ------- virtual相关推荐

  1. Using a physical whiteboard is more effective than virtual tools in the stand-up meeting.

    During a stand-up meeting we always use whiteboard, such as Trello, RTC and Jira etc. I prefer to us ...

  2. Effective C++(9) 构造函数调用virtual函数会发生什么

    问题聚焦: 不要在构造函数和析构函数中调用virtual函数,因为这样的调用不会带来你预想的结果. 让我先来看一下在构造函数里调用一个virtual函数会发生什么结果 Demo class Trans ...

  3. effective c++:virtual函数在构造函数和析构函数中的注意事项

    effective c++:virtual函数在构造函数和析构函数中的注意事项 如不使用自动生成函数要明确拒绝 对于一个类,如果你没有声明,c++会自动生成一个构造函数,一个析构函数,一个copy构造 ...

  4. Effective C++条款09:绝不在构造和析构过程中调用virtual函数

    Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...

  5. Effective C++ .07 virtual析构函数的提供

    主要讲了, 1. virtual析构函数的作用与调用顺序 2. 使用时机,并不是使用了继承就要把基类的析构函数变为虚函数(virtual),只有当用于多态目的时才进行一个virtual析构函数的定义. ...

  6. Effective C++条款7:为多态基类声明virtual析构函数

    要点: 带多态性质的基类或者class中有virtual函数,就应该将析构函数声明为virtual,例如 class TimeKeeper { public:TimeKeeper();~TimeKee ...

  7. 用virtual实现TemplateMethod和Strategy--龙之介《Effective C++》实验室

    条款35:考虑virtual函数以外的其他选择 假设你现在的需求是实现一个返回伤害值的功能. 由于不同的人物可能会以不同的方式计算他们的伤害值 所以这可以使用virtual来定义它,子类可以进行重新定 ...

  8. effective C++读书笔记--【条款07:为多态基类声明virtual析构函数】

    问题 base class的指针p,指向一个derived class,如果: base class带着一个non-virtual析构函数: derived class对象经由这个base class ...

  9. Effective STL 50条有效使用STL的经验笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

最新文章

  1. Windows下在Django中创建项目时ImportError: No module named django.core解决方法
  2. 优化C代码常用的几招
  3. [BUUCTF-pwn]——gyctf_2020_borrowstack
  4. mysql srid_mysql8 参考手册--索引优化
  5. phpul 无序列表,PHP – 简单嵌套无序列表(UL)数组
  6. chrome vue 未响应_vue之骨架屏踩坑之路
  7. HTML 代码复用实践 (静态页面公共部分提取复用)
  8. 家用计算机选购,家用电脑该如何选择?什么配置比较好?看完这篇文章你就懂了...
  9. 9550电机_电机扭矩计算公式里面的9550*P是怎么得来的?
  10. ANSYS——模态分析的理论基础
  11. 如何通过定时关机命令,实现Windows XP的自动关机?
  12. 计算理论导引重点知识回顾
  13. 【模电】0013 反馈放大电路基础
  14. 程序员都会的常用Linux网络命令汇总
  15. Rhombus 使用 Wolfspeed SiC 加快电动汽车充电速度
  16. 蜜蜂问题- 斐波那契数列
  17. win10-SW2016工程图关联零件属性链接操作
  18. 隔离电源与非隔离电源的选择及优缺点分析
  19. midi键盘接电脑实现电子琴功能
  20. HG 新闻 RS5 环境点

热门文章

  1. python求和函数1到100_Python定义函数实现累计求和操作
  2. share with用法
  3. 如何设计APP版本号?
  4. [AT2567] [arc074_c] RGB Sequence
  5. 国际软件设计文档——概要设计说明书
  6. Java 和 Python 解析动态 key 的 JSON 数据
  7. zoj3806Incircle and Circumcircle
  8. JavaScript学习05 定时器
  9. mfc中主窗体显示(任务栏上方显示)
  10. linux 多个变量,linux-BASH-使用相同“变量”的多个实例读入...