上一篇Effective C++ --5 实现

32、确定你的public继承塑模出is-a关系

(1)public 继承意味着is-a。适用于base class身上的每一件事一定也适用于derived class身上,因为每一个derived class对象也就是一个base class 对象。

33、避免遮掩继承而来的名称

(1)derived class内的名称会掩盖base class内的名称,不论函数是否是virtual或者参数是否一致。

(2)为了让被遮掩的名称再见天日,可使用using 声明式或者转交函数,转交函数时base class名称加::函数名,并且暗自为inline。

34、区分接口继承和实现继承

(1)接口继承和实现继承不同。在public继承之下,derived class总是继承base class的接口。

(2)声明一个pure virtual函数的目的是为了让derived class只继承函数接口;而impure virtual函数的目的是让derived class继承该函数的接口和缺省实现;声明non-virtual函数的目的是为了令derived class继承函数的接口以及一份强制性实现。

35、考虑virtual函数以外的其他选择

(1)使用NVI(non-virtual interface)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹教低访问性(private或protected)的virtual函数。优点是确保在virtual函数进行真正工作之前和之后可以设定好场景和清理场景。

(2)将virtual函数替换为“函数指针成员变量”,这是strategy设计模式的一种分解表现形式。优点是像是“每个对象可各自拥有自己的函数”和“可在运行期改变计算函数”,带来的缺点是,非成员函数无法访问class的non-public成员,需要声明为friend。

(3)以tr1::function成员变量替换virtual函数,因而允许使用任何调用物搭配一个兼容于需求的签名式。这也是strategy设计模式的某种成分。

(4)将继承体系内的virtual函数替换为另一个继承体系内的virtual函数。这是strategy设计模式的传统实现手法。

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

37、绝不重新定义继承而来的缺省参数值

(1)virtual函数系动态绑定,而缺省参数值却是静态绑定,c++这样做是出于效率的考虑。所谓静态类型,是它在程序中被声明时所采用的类型;动态类型是指目前所指对象的类型。

38、通过复合塑模出has-a或“根据某物实现出”

(1)在应用域,复合意味着has-a;在实现域,复合意味着is-implemented-in-terms-of(根据某物实现出)。

39、明智而审慎地使用private继承

(1)private继承纯粹是一种实现技术,只是意味着只有部分被继承,接口部分没有继承。

(2)empty class对象不使用任何空间,因为没有任何隶属对象的数据需要存储。但是,C++裁定凡是独立对象必须有非零大小。EBO(empty base optimization,空白基类最优化),stl中的base class unary_function和binary_function都是empty class,这样的继承很少增加derived class的大小。Private继承可以造成empty base最优化,这对“对象尺寸最小化”的开发者很重要。

(3)private 继承意味着is-implementated-in-terms of。它通常比复合级别低,但是当derived class需要访问protected base class的成员,或者需要重新定义继承而来的virtual函数时,这么设计是合理的。

40、明智而审慎地使用多重继承

(1)多重继承比单一继承复杂,可以会导致歧义(如两个基类中都有一个函数,调用时必须要明确是哪个基类中的函数),以及对virtual继承的需要(如“钻石型多重继承”,此时令带有数据的base class成为virtual base class)。

(2)virtual继承为增加大小、速度、初始化(及赋值)复杂度等等成本。如果virtual base class不带任何数据,将是最具有实用价值的情况。

(3)多重继承的确有正当用途。其中一个情节涉及“public 继承某个interface class”和“private继承某个协助实现的class”的两相组合。

Effective C++ --6 继承与面向对象设计相关推荐

  1. Effective C++: 06继承与面向对象设计

    32:确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public继承表示的是"is-a"(是一种)的关系. 如果令class D以pub ...

  2. 【effective c++】继承与面向对象设计

    1.确定你的public继承塑造出is-a关系 public继承意味着is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived ...

  3. C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design

    继承与面向对象设计 Inheritance and Object-Oriented Design 面向对象编程已经风靡编程界,关于继承.派生.virtual函数等等需要深入了解. 32.确定你的pub ...

  4. 《Effective C++》第三版 第六章 继承与面向对象设计 32~35条例

    文章目录 条款32:确定你的 `public` 继承塑膜出 is-a 关系 故事引入规则 案例说明 小结上代码 公有继承用法 企鹅不会飞 企鹅会飞,但那是错的! 总结 请记住 条款33:避免遮掩继承而 ...

  5. (6)继承与面向对象设计- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)

    文章目录 32. 确定你的public继承塑模出is-a关系(Make sure public inheritance models "is-a") 33. 避免遮挡继承而来的名称 ...

  6. 《Effective C++ 3th》——继承与面向对象设计

    文章目录 Is A 确定你的public继承塑模出is-a关系 避免遮掩继承而来的名称 区分接口继承和实现继承 考虑virtual函数以外的其他选择 绝不重新定义继承而来的non-virtual函数 ...

  7. Effective C++:改善程序与设计的55个具体做法

    Effective C++:改善程序与设计的55个具体做法 二.构造/析构/赋值运算 05 Know what functions C++ silently writes and calls. 06 ...

  8. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  9. C++面向对象设计原则详解

    概述 C++面向对象设计原则主要包括以下几点: 依赖倒置原则 开放封闭原则 单一职责原则 里氏替换原则 接口隔离原则 封装变化点原则 面向接口编程原则 优先使用对象组合,而不是类继承 接下来详细的分析 ...

最新文章

  1. Hadoop(十二):从源码角度分析Hadoo是如何将作业提交给集群的
  2. Kafka系列一之架构介绍和安装
  3. android打包apk时混淆遇到的问题
  4. 进程间通信:消息队列概念及代码
  5. JavaScript模块化不算漫长的发展史
  6. python中的字体英文名_获取中文字体的英文名字
  7. Java排序算法之--快速算法--快速上手
  8. Python实现二叉树
  9. java for循环时间最短_Java For循环vs While循环,奇怪的行为和时间性能
  10. Likecloud-吃、吃、吃
  11. kodi没有声音_如何使用Yatse用声音(及更多)控制Kodi
  12. 电梯控制线路实训考核系统
  13. 如何更换python版本
  14. mac换硬盘重装系统记录
  15. Summits poj3503
  16. 爱分析·中国采购数字化行业趋势报告
  17. 最详细的 Deepin安装idea2018及破解教程,有效期到2100年
  18. 【akka】初识Akka 简单介绍
  19. python 字典的学习
  20. Feb. 27, 16:00-17:00, 1479, Energy-critical Schrodinger equations on manifolds by Sebastian Herr

热门文章

  1. 谈谈对搜索技术Elastic SearchLucene的理解
  2. spring boot多数据源配置(mysql,redis,mongodb)实战
  3. Solr之搭建Solr6.0服务并从Mysql上导入数据
  4. 大众点评订单分库分表实践之路
  5. 本周看代码找bug总结
  6. insightface和facenet效果+性能比较
  7. 张首晟:用科学思维指导投资
  8. 既要宽广,又要深邃,这也行
  9. 计算图上的微积分:Backpropagation 微积分 SOTON数据分析 · 2015-09-06 08:52 [译] 计算图上的微积分:Backpropagation 引言 Backprop
  10. linux 删除20日前数据,Linux 维护常用命令