派生类和基类之间的特俗关系是基于C++继承的底层模型的。
总所周知,C++具有三种继承:公有继承、私有继承、保护继承。

最常见的就是公有继承,它建立一种is-a的关系。
如何理解is-a呢?即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。

举个栗子:
有一个水果Fruit类,可以保存水果的重量和热量;
香蕉是一种水果,所以可以从Fruit类派生出Banana类;
Banana类继承了父类的所有数据成员,因此,Banana对象将包含表示香蕉重量和热量的成员;
此外,Banana类可以添加专门用于香蕉的成员。
但是,Banana类不能删除基类的Fruit的属性。
因此Banana is a kind of Fruit,即我们所说的is-a关系。class Banana:public Fruit
{
};

那么has-a关系呢?

同样举个栗子:
午餐可能包括水果,但是午餐并不是水果;
所以不能从Fruit公有派生出Lunch类;
在午餐中加入水果的正确方法是将其作为一种has-a关系。

那么如何实现has-a呢?
通常的是有两种方法:包含和私有继承。
所谓的包含就是将Fruit对象作为Lunch类的数据成员,即新的类包含一个类的对象。
所谓的私有继承就是class Lunch:private Fruit。

通过分析我们知道:
使用公有继承而已继承接口,也可能还有实现。获得接口是is-a关系的组成部分;
而使用包含,类可以获得实现,但不能获得接口。不继承接口是has-a关系的组成部分。

那么如何实现包含,如何实现私有继承,以及两种建立has-a关系的方法有何不同,将会在后续的博客中进行阐述。

浅析C++中的is-a和has-a关系(公有继承、包含、私有继承)相关推荐

  1. C++中公有继承、保护继承、私有继承

    就class之间的关系做一个简单的定义,继承base class的class,base class可以认为class都是自己的子女. 1.public:public表明该数据成员.成员函数是对所有用户 ...

  2. 关于C++中公有继承、私有继承、保护继承的讨论

    一.文章来由 简单明了的理由,老生常谈但是没真正解决的问题,想搞清楚这个问题. 二.冗长的定义 我们先来看看这些冗长的定义: 公有继承: 当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性 ...

  3. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  4. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  5. 计算机网络中路由器,浅析计算机网络中的路由器

    浅析计算机网络中的路由器 通过路由器的结构 ,分析了路由器的基本原理及功能 ,进而 (本文共2页) 阅读全文>> 由于路由器的应用越来越广泛,所以对网络路由器在使用过程中发生的故障,我们也 ...

  6. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  7. 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案

    浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案 参考文章: (1)浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的 ...

  8. mysql concat例子_浅析MySQL中concat以及group_concat的使用

    说明: 本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接参数 ...

  9. 浅析软件工程中的UML建模技术

    一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...

最新文章

  1. 安卓升级固件update.zip解析
  2. VTK:彩色注释立方体用法实战
  3. pert计算公式期望值_PERT和三点估算技术
  4. Java服务CPU飙到99%问题排查
  5. 论中国和欧洲程序员对加班的态度
  6. 在SAP云平台上部署和运行Docker应用
  7. Android uevent
  8. Docker如何删除一个镜像
  9. 计算机组成原理实验内存读数,计算机组成原理实验
  10. Web安全之点击劫持
  11. SpringBoot学习之一 Unable to find a single main class from the following candidates
  12. 普元eos运行环境下的逻辑流及页面流反编译工具
  13. fw300r虚拟服务器设置,迅捷(FAST)FW300R无线路由器怎么设置
  14. win10下Google Chrome 打不开网页的解决方案
  15. BZOJ3560 DZY Loves Math V
  16. HP笔记本电源开关灯常亮,不能开机的处理
  17. PCB相关知识-焊盘Pad
  18. 网页链接跳转qq聊天界面以及QQ群是什么实现的
  19. Excel绘制图表时X轴在有数据点的地方才出现刻度标签
  20. ext2 / ext3 结构分析

热门文章

  1. SQL中查询表中包含的字段名称
  2. Arduino ESP8266 +0.96“Oled屏幕基于U8g2库实现充电和wifi图标动态显示
  3. 单链表——单链表逆置(不带头结点)
  4. Linux系统上安装Windows虚拟机【VMware】
  5. CSS3动画(2D/3D转换、过渡、动画和多列)
  6. 什么是服务网格service-mesh?
  7. Rails Rake 指南
  8. 什么是递归,通过这篇文章,让你彻底搞懂递归
  9. 印尼海啸的捐款名单和此次地震捐赠对比
  10. Qt开发的TCP客户端和服务器