对于常规的基类函数来说:

1 尽量使用非虚拟接口模式(NVI)让接口函数成为非虚拟的。

2 尽量让虚函数成为私用的。

3 只有当派生类需要调用基类对某个虚函数的实现时,才把虚函数声明为保护的。

4 基类的析构函数应该要么为共有虚函数,要么为保护虚函数。

说明;1,2两条将虚公有接口的两个职责进行了很好的分解,遵守了单一职责原理。

  第4条说明了:如果要使用多态(指针调用),那么基类的析构函数一定要为虚函数;如果基类本身的设计不是处于多态考虑的话,那么就应该将析构函数设为保护类型。这样可防止出现使用指针的析构(基类无法被直接析构),只有派生类才能析构基类。

  1) 非虚接口模式(NVI)的说明:基类对接口具有完全控制权,很方便在一个单一的、可复用的地方实施(enforce)接口的前条件。后条件、插入一些设备或做一些类似的事情。更好的是实现接口和实现分离;让基类在变化面前更稳定。条件检查可以仅在调式期有效,这更易于控制。如果非虚函数仅有唯一一行转发调用,编译器会做内联优化,没有效率问题。

本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2010/11/30/virtual_function.html   ,如需转载请自行联系原作者

[C++再学习系列] 虚函数的4条规则相关推荐

  1. c++面向对象高级编程 学习六 虚函数

    虚函数:在成员函数前面加上virtual,函数就变成了虚函数 继承函数:子类可以调用父类的函数,叫做继承了函数,即函数的调用权 三种函数: non-virtual 函数: 你不希望 derived c ...

  2. C++学习笔记——虚函数

    2019独角兽企业重金招聘Python工程师标准>>> 基本概念 虚函数是在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为: virtual ...

  3. 跟我一起学习C++虚函数--第一篇

    2019独角兽企业重金招聘Python工程师标准>>> 我们知道,虚函数作为C++实现多态的方式,具有强大的RTTI(RunTime Type Identification)功能.虚 ...

  4. [C++再学习系列] 函数模板和类模板

    函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...

  5. 深度强化学习系列: “奖励函数”的设计和设置(reward shaping)

    概述 前面已经讲了好几篇关于强化学习的概述.算法(DPG->DDPG),也包括对环境OpenAI gym的安装,baseline算法的运行和填坑,虽然讲了这么多,算法也能够正常运行还取得不错的效 ...

  6. [C++再学习系列] 前置++与后置++

    前置++: type operator++(); 后置++: const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数,当函数被调 ...

  7. [C++再学习系列] 变量的声明、定义与extern关键字

    变量的声明与定义: A definition of a variable allocates storage for thevariable and may also specify an initi ...

  8. [C++再学习系列] 具有链接的C++实体

    具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的.具有链接的实体如果在源文件(cpp)中出现多次,将意味着多次分配内存,每个内存空间定义一个特定的实体.这会导致:1) 空间膨胀:2) 出 ...

  9. MATLAB学习系列--绘制函数曲线

    函数与分段函数 绘制函数曲线 直接使用M文件 使用函数 function 分段函数定义和使用 法1:分段函数的输入参数是单个的X值 法2:定义分段函数的输入参数是向量X 绘制函数曲线 直接使用M文件 ...

最新文章

  1. Lean Startup
  2. Java中变量、类初始化顺序
  3. GitHub优秀开源项目收集
  4. Angular2组件与指令的小实践——实现一个图片轮播组件
  5. Java 12常规可用性
  6. 编程之美----子数组的最大乘积
  7. 如何知道linux的ssh秘钥是否匹配,SSH密钥验证
  8. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
  9. AMD平台下在Windows虚拟机中安装Mac10.8.3的注意事项
  10. 【Java】@ResponseBody 返回JsonObject
  11. 关于最近有人恶意诽谤Yeslab的回应!
  12. Keras学习---数据预处理篇
  13. java黄金分割点游戏_结对编程--黄金分割点游戏
  14. 仿豆果美食tableview的展开和收缩效果
  15. kubectl 命令详解(三十五):rollout undo
  16. 微信小程序--石头剪刀布(小游戏)
  17. elasticsearch7.8.0入门操作
  18. 什么是指令重排序?为什么要重排序?
  19. C++经典算法题-迭代法求方程根
  20. 白话数字化-1:什么是数字化?

热门文章

  1. angular 上传图像的使用总结
  2. fail-fast机制
  3. sql基础知识第二部分
  4. UICollectionViewController
  5. 那些必须要知道的Javascript
  6. 少年Vince之遐想
  7. DataSet数据导入到Excel
  8. Qt Plain C++ Project error: undefined reference to `pthread_create'
  9. 机器学习:神经网络之表达
  10. osqa mysql_osqa安装出现的问题解决办法 | 学步园