博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数
阅读量:6928 次
发布时间:2019-06-27

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

本文为senlie原创。转载请保留此地址:

经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例
演示样例:
class B{public:	void mf();	//...};class D: public B{public:	void mf(); // 遮掩了B::mf。Item 33 名称遮掩规则}D x;B *pB = &x;D *pD = &x;pB->mf(); // 调用  B::mfpD->mf(); // 调用  D::mf
解析:
1.non-virtual函数是静态绑定的。 pB声明的类型(pointer-to-B)是静态的,而pB指向的类型(class D)是动态的。
通过pB 调用的 non-virtual函数永远是B所定义的版本号
2.
public 继承意味着is-a,适用于B对象的每一件事,也适用于D对象,由于每一个D对象都是一个B对象
不变性凌驾特异性,B的derived classes一定会继承 mf 的接口和实现。由于 mf是B的一个 non-virtual 函数
又一次定义继承 non-virtual函数后产生的茅盾:
假设D真有必要实现出与B不同的mf,那么“每一个D都是一个B”就不为真。就不应该以 public 形式继承 B
假设D真的必须以 public 形式继承B,而且假设D越有须要实现出与B不同的 mf,那mf就无法为B反映出“不变性凌驾特异性”的性质

你可能感兴趣的文章
关于SSDCRM中邮件群发不了的一点说明
查看>>
双网卡上网配置
查看>>
马哥Linux笔记--VMware Workstation系统虚拟化
查看>>
我的友情链接
查看>>
Linux下Memcached服务器端的安装
查看>>
linux文件系统
查看>>
git入门教程
查看>>
JDK1.5,1.6,1.7,1.8新增特性
查看>>
git-jenkins-k8s构建tomcat项目实践
查看>>
sql server考试题
查看>>
centos7 简单安装puppet
查看>>
IOS--UINavigationBar修改背景色
查看>>
独辟蹊径系列 带着大家玩Android
查看>>
js art.dialog删除
查看>>
chrome表单自动填充导致input文本框背景变成偏黄色问题解决
查看>>
thinkphp模板中使用函数的方法
查看>>
Spring MVC学习(七)-------SpringMVC数据类型转换
查看>>
Android应用与开发环境
查看>>
找了个生男生女清宫图,感觉挺准的
查看>>
solrcloud 监控
查看>>