首先看一下private继承的法则:
class之间的继承关系如果是private的话,那么编译器不会将一个derived对象自动当作为一个base class对象。

从base class继承而来的所有方法以及属性,在derived class都会变成是private的。
 
private继承的底层含义实际上是;implemented in terms of,通过private继承的主要目的是使得derived class使用base 已经做好的某些东西,但是外部仍然是无法岁base class的部分进行访问的。(实现继承,省略接口部分)
 
虽然说private继承以及组合都可以实现implemented in terms of的关系,但能使用组合还是应该尽量使用组合。
 
小结:
当面对  不存在is-a关系的两个class的时候,其中一个需要访问另一个的protected成员,或者需要重新定义其一或者多个virtual函数的时候,private才有可能成为适合的选择。
在考虑完public 组合继承的方式之后,才应该考虑private继承
 
与符合不同的是,private继承可以造成empty base的最优化,这对于某些希望减小对象尺寸的库作者来说还是很有用的(例如stl就是这样。)

条款39:明智的使用private继承的更多相关文章

  1. 条款39:明智而审慎的使用private继承

    Use private inheritance judiciously. 如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base cla ...

  2. 条款39: 避免 "向下转换" 继承层次

    基类指针不能调用派生类的独有的成员,即使基类指针指向派生类对象,因为编译器是根据指针的静态类型来确定调用对象在内存中占据的空间的.此时可以使用static_cast来转换,但不要这么做,因为向下转换难 ...

  3. Effective C++:条款39:明智而审慎地使用private继承

    (一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...

  4. Effective C++ -----条款39:明智而审慎地使用private继承

    Private继承意味is-implemented-in-terms of(根据某物实现出).它通常比复合(composition)的级别低.但是当derived class需要访问protected ...

  5. 条款39:明智而审慎地使用private继承(use private inheritance judiciously)

    NOTE: 1.private 继承意味 is-implemented-in-terms-of(根据某物实现出).它通常比复合(composition)的级别低.但是当derivated class需 ...

  6. 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承

    1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...

  7. 读书笔记_Effective_C++_条款三十九:明智而审慎地使用private继承

    private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡 ...

  8. 【39】明智而审慎第使用private继承

    1.private继承意味着,根据某物实现出,继承父类的实现,关闭父类的接口,并不是Is-A的关系,不满足里氏代换,继承的内容访问权限都修改为private. 2.那么问题来了,复合也表达根据某物实现 ...

  9. Effective C++ 条款39

    我从本条款中学到了下面内容: 1.private继承不同于另外两种继承,派生类对象不能隐式转换为基类对象. 例如以下代码: class Bird//鸟 { }; class ostrich:priva ...

随机推荐

  1. Windows 上将Tomcat 8 安装为系统服务

    第一部分 应用场景 需要服务器上Tomcat不显示启动窗口 需要服务器上Tomcat开机自启动 ... 第二部分 配置过程 一.修改配置文件 1 {Tomcat_HOME}/bin/service.b ...

  2. 虚拟化qemu-img的简单用法。

    qemu-img 命​令​行​工​具​是​ Xen 和​ KVM 用​来​格​式​化​各​种​文​件​系​统​的​,可​使​用​ qemu-img 格​式​化​虚​拟​客​户​端​映​像​.​附​加​ ...

  3. jmeter 监控插件JMeterPlugins&PerfMon安装

    下载地址:http://jmeter-plugins.org/downloads/all/ PerfMon: 用来监控Server的CPU.I/O.Memory等情况 ServerAgent-2.2. ...

  4. input propertyChange

    結合 HTML5 標準事件 oninput 和 IE 專屬事件 onpropertychange 事件來監聽輸入框值變化. oninput 是 HTML5 的標準事件,對於檢測 textarea, i ...

  5. HackerRank - fibonacci-modified 【大数】

    思路 用PYTHON 或 JAVA 干掉 AC代码 a, b, n = map(int, input().split()) for i in range (2, n, 1) : temp = b b ...

  6. octotree神器 For Github and GitLab 火狐插件

    Code tree for GitHub and GitLabExtension to show code tree for GitHub and GitLab. Useful for develop ...

  7. Linux用户和用户组管理 用户配置和管理的相关文件

    用户信息文件 /etc/passwd 这个文件中保存的就是系统中所有的用户及其对应的用户主要信息. 文件格式 :  第1字段 第2字段 第3字段 第4字段 第5字段 第6字段 第7字段 用户名称 密码 ...

  8. ES6 随记(3.1)-- 字符串的拓展

    上一章请见: 1. ES6 随记(1)-- let 与 const 2. ES6 随记(2)-- 解构赋值 4. 拓展 a. 字符串的拓展 有些字符需要 4 个字节储存,比如 \uD83D\uDE80 ...

  9. css li 间隙

    如果 li 未浮动,而 li 子元素浮动,则ie6和ie7下会出现间隙,解决办法是给 li 写上css hack      *vertical-align:bottom;

  10. java 程序的使用

    Java程序可以在任何安装有Java平台的系统上运行,运行的时候语法如下: java -jar <program.jar>   -jar这个参数是必须有的,后面跟你的java程序,例如我们 ...