绝不重新定义继承而来的non-virtual函数

class  B
{public:void mf();...
};class D : public B
{...
}

有以下调用:

D x;
b
B* pB = &x;
pB->mf(); // line1D* pD = &x;
pD->mf(); // line2

line1、line2都是调用的是=B::mf()

如果Class D重新定义了mf():

class D : public B
{public:void mf();...
}

则line1调用B::mf(), 而line2调用D::mf()。原因是non-virtual函数B::mf()D::mf()都是静态绑定

另一方面,virtual函数却是动态绑定,所以它们不受这个问题之苦。如果mf是个virtual函数,不论是通过pB或者pD调用mf,都会导致调用D::mf,因为pB和pD真正指的都是类型为D的对象。

如果正在编写的class D重新定义继承自class B的non-virtual函数mf,D对象很可能展现出精神分裂的不一致行为。更明确的说,任何一个D对象都可能表现出B或D的行为;决定因素不在对象自身,而在于"指向该对象之指针"当初的声明类型。References也会展现和指针一样难以理解的行径。

现在,如果D重新定义mf,你的设计便会出现矛盾


如果D真有必要实现出与B不同的mf,并且如果每一个B对象-不管多么特化=真的必须使用B所提供的mf实现码,那么"每一个D都是B"就不为真。既然如此D就不应该以public形式继承B。


另一方面,如果D真的必须以public方式继承B,并且如果D真有需要实现出于B不同的mf,那么mf就无法为B反映出"不变性凌驾特异性"的性质。既然这样mf应该声明为virtual函数。


最后,如果每个D真的是一个B,并且如果mf真的为B反映出"不变性凌驾特异性"的性质,那么D便不需要重新定义mf,并且它也不应该尝试这样做。

请记住:

决定不要重新定义继承而来的non-virtual函数。

36. Never redifine an inherited non-virtual function相关推荐

  1. C++中的虚函数(virtual function)

    1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...

  2. 虚函数(Virtual Function)与 纯虚函数(Pure Virtual Function)

    1>虚函数(Virtual Function) 1.1>Base Class #ifndef Animal_h #define Animal_h #include <string&g ...

  3. virtual function的一些心得

    为什么80%的码农都做不了架构师?>>>    virtual function是design上一个非常好的东西,它可以在保持面向接口编程的前提下做到运行时刻动态决定使用某一种实现. ...

  4. [C++] Pure Virtual Function and Abstract Class

    Pure Virtual Function Abstract Class 转载于:https://www.cnblogs.com/tianhangzhang/p/4966722.html

  5. C++ 中的Virtual Function (虚函数)

    1.C++ Virtual 用法 这里只讲语法,因为讲原理比较难.还没有涉及到构造函数.那么就直接上代码了: // VitualFunction.cpp : Defines the entry poi ...

  6. Pure Virtual Function

    Pure Virtual Function • If a base class has no natural implementation for a virtual function, then t ...

  7. 记一个bug : C2555 overriding virtual function return type differs and is not covariant from

    今天同事遇到一个编译错误找我帮忙看一下.原以为编译错误应该好解决,没想到搞了半天才fix,在此记录一下. 由于公司代码涉及机密且比较复杂,不方便贴出来,因此我写了一个简化的例子来展示这个编译错误是如何 ...

  8. 运行opencv程序后出现runtime error! R6025-pure virtual function call 错误提示的解决方法

    运行opencv的代码,主函数(main)返回时产生了runtime error! R6025-pure virtual function call 的错误提示,若程序前面的所有代码都没有问题,就到最 ...

  9. R6025 pure virtual function call

    出现了 R6025 pure virtual function call 这个错误,今天上午调试程序的时候. 后来问了公司的前辈,知道了,原来我继承了一个类,该类中有个 纯虚函数. 重写了这个函数,但 ...

  10. mindmanager的R6025 - pure virtual function call错误解决办法

    原文链接:mindmanager的R6025 - pure virtual function call错误解决办法 今天发现了一个问题:mindmanager打不开文件了 提示: ---------- ...

最新文章

  1. 在Cloudshare上使用PAL=〉系统检查及初始化
  2. Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中
  3. Javascript 5 种原始数据类型
  4. jstree 节点拖拽保存数据库
  5. 正在东京、首尔开DevDays
  6. element table表格里的多选按钮,根据条件判断是否可以被选中
  7. [转载]敏捷开发,你真的做对了吗?
  8. 如何在Mac设置开机自启程序项
  9. oracle regexp
  10. 传智播客-刘意-java深入浅出精华版学习笔记Day01
  11. 校园表白墙、微信表白墙、大学生树洞,交流圈子,用Fotoo创建
  12. 【JY】浅析各动力求解算法及其算法数值阻尼(人工阻尼)
  13. 闲鱼平台API,item_search - 按关键字搜索闲鱼商品
  14. 1360: plank 栅栏修复
  15. 【电路设计】TTLCMOS芯片型号总结
  16. 实现火车站售票的例子
  17. “中国科技青年英雄榜”揭晓,AI 领域占半数,楼天成、印奇、戴文渊等入选
  18. 虚拟机centos安装web服务器
  19. 从零开始编译OpenWrt固件
  20. html引用不了自定义字体,html5 – 自定义@ font-face不加载chrome(chrome自定义字体无法渲染)...

热门文章

  1. 【排坑】内外部事务的回滚问题(三)
  2. Tizen已经够烂了 但份额还是超过了黑莓
  3. javascript异步延时加载及判断是否已加载js/css文件
  4. C++生成随机数:几何分布(geometric distribution)
  5. “懒惰”Linux:“懒惰”集群管理员的 11 个秘诀
  6. 谈谈主策划需要的能力
  7. 7.企业安全建设指南(金融行业安全架构与技术实践) --- 外包安全管理
  8. 13.看板方法---使用两层系统扩展看板
  9. 31. Magento图片大小调整的相关代码
  10. android版本大于26,装包的API等级(targetSdkVersion)必须等于或高于26,请从新打包上传...