C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。

一、如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。

不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。

二、如果类B 有必要使用A 的功能,则要分两种情况考虑:

(1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 可以从类Human 派生,类Boy 可以从类Man 派生。示例程序如下:

(2)若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。示例程序如下:

上述程序十分简短并且运行正确,但是这种设计却是错误的。这就开头所说的很多程序员经不起“继承”的诱惑而犯下设计错误。

附:

何为组合:

比如有两个类A、B,C类由A.B继承而来,

下面就是组合模式,有点像零件的拼装

  class A{//...};class B{//...};class C{A a;B b;};

免费领取C++资料包

c++基础:继承与组合!相关推荐

  1. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  2. C++ 面向对象(一)继承:继承、对象切割、菱形继承、虚继承、继承与组合

    目录 继承 继承的概念 继承方式 基类与派生类的赋值转换 作用域与隐藏 派生类的默认成员函数 友元与静态成员 友元 静态成员 多继承 菱形继承 虚继承 继承和组合 什么是组合 如何选择组合和继承 继承 ...

  3. C++ 继承与组合的区别

    C++ 程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及两个概念,一个是继承(Inheritance),一个是组合(Composition).因为二者有一定的相似性,往往令程序 ...

  4. Python 类的继承和组合

    面向对象的编程带来的主要好处之一是代码的复用,实现这种复用的方法之一是通过继承机制. python中解决代码复用的方式:继承和组合. 1 什么是继承 继承是一种创建类的方法,在python中,一个类可 ...

  5. 【Java SE】继承;组合;向上转型;动态绑定;方法重写;静态绑定;多态;抽象类;接口;

    面向对象编程 文章目录 1. 包 1.1 导入包中的类 1.2 静态导入 1.3 将类放到包中 1.4 包的访问权限控制 1.5 常见的系统包 2. 继承 2.1 语法规则 2.2 protected ...

  6. C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)

    二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...

  7. pythond的执行原理_python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  8. Bash基础(2) 通配符 组合键 数据重定向 管道 tee

    Bash基础(2)     通配符  组合键  数据重定向  管道  tee命令 1 文本名"通配符" *:匹配任意长度的任意字符: ?:匹配任意单个字符: []: 匹配指定范围内 ...

  9. java 继承 模型_java – 画布形状模型的继承与组合?

    对于以下模型,您更喜欢继承还是组合: >我想在画布上绘制对象,每个对象代表一个数据对象 >将其视为状态机图:椭圆表示状态,线表示它们之间的连接/转换.对象表示本身永远不会改变,即状态将始终 ...

  10. 详细分析如何在java代码中使用继承和组合

    文章目录 继承与组合 何时在Java中使用继承 何时在Java中使用组合 继承与组成:两个例子 用Java继承重写方法 Java不具有多重继承 使用super访问父类方法 构造函数与继承一起使用 类型 ...

最新文章

  1. MyBatis01 Idea中搭建MyBatis开发环境
  2. linux网络编程一:主机字节序与网络字节序的的判断
  3. Linux 网络 IO 模型
  4. C语言实现的ABCI
  5. python下常用OpenCV代码
  6. 通过QuartzCore/CoreAnimation.h实现让玫瑰花飞舞
  7. android R编译OTA时报“ExternalError: Invalid ro.product.property_source_order”解决方法
  8. php线程安全和非线程安全_安全调用线程的步骤
  9. Spark:通过start-slaves.sh脚本启动worker报错:Permission denied
  10. distpicker实现省市级联动
  11. 浅谈未来计算机操作系统的发展方向,浅谈未来计算机操作系统的发展方向
  12. 信息安全专业学习建议
  13. ImportError: _C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN2at4_ops6narrow4callERKNS_6Ten
  14. c语言求球的体积用const,牛客练习赛41 E.球的体积并(计算几何)
  15. 安卓端身份证识别与云端服务器识别
  16. 后端好书阅读与推荐(续四)
  17. java 求两个list 集合的交集,重复的元素
  18. Matplotlib保存图片到文件
  19. apollo github的说明介绍
  20. JMeter - 如何测试REST API / 微服务

热门文章

  1. Vivado中的Incremental Compile增量编译技术详解
  2. shiro 基于springmvc中做登陆功能
  3. Django(6)-orm
  4. 时序数据库技术体系-时序数据存储模型设计
  5. float/文档流/清除浮动
  6. iOS应用日志:开始编写日志组件与异常日志
  7. Block和inline元素对比
  8. 高薪诚聘游戏引擎研发,有意者请与我联系!
  9. 服务器温度检测软件_科技产品—整机柜服务器—产品简介
  10. 地图不显示_图灵搜不显示地图,软件打开一片空白,怎么解决?