**•组合(或包含)方式。**这是我们通常采用的方法。
**•c++还有另一种实现has-a关系的途径—私有继承。**使用私有继承,基类的公有成员和保护成员都将称为派生类的私有成员。这意味着基类方法将不会称为派生对象公有接口的一部分,但可以派生类的成员函数中使用它们。而使用公有继承,基类的公有方法将称为派生类的公有方法。简言之,派生类将继承基类的接口:这是is-a关系的一部分。使用私有继承,基类的公有方法将称为派生类的私有方法,即派生类不继承基类的接口。正如从被包含对象中看到的,这种不完全继承是has-a关系的一部分。 使用私有继承,类将继承实现。例如,如果从String类派生出Student类,后者将有一个String类组件,可用于保存字符串。另外,Student方法可以使用String方法类访问String组件。
包含将对象作为一个命名的成员对象添加到类中,而私有继承将对象作为一个未被命名的继承对象添加到类中。我们使用术语子对象来表示同继承或包含添加的对象。 因此,私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
•使用包含还是使用私有继承? 由于既可以使用包含,也可以使用私有继承来建立has-a关系,那么应使用何种方式呢?大多数C++程序员倾向于使用包含。
–首先,它易于理解。类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象,而使用继承将使关系更抽象。
–其次,继承会引起很多问题,尤其从多个基类继承时,可能必须处理很多问题,如包含同名方法的独立的基类或共同祖先的独立基类。 总之,使用包含不太可能遇到这样的麻烦。
–另外,包含能够包

C++实现has-a关系的两种方法相关推荐

  1. 用两种方法改错,体会封装和友员的关系!

    用两种方法改错,体会封装与友员的关系. #include<iostream.h> Class Animal; void setValue(Animal & pa,int pw) { ...

  2. 从上升边和带宽关系的两种公式说起

    上升边时间和信号带宽的关系,不同的资料里,遇到过两种公式表达: 关于这两个公式,也有转折频率的说法,即脉冲的大部分能量集中在转折频率以下,有效频率分量,转折频率,只是说法不同罢了. 为什么会有两个公式 ...

  3. 004 两种方法找寻路call

    文章目录 关于寻路call 通过参数找寻路call CE搜索寻路目的地坐标 通过参数定位寻路call 寻路call参数分析 寻路call代码测试 寻路状态找寻路call 搜索寻路标志位 通过寻路标志位 ...

  4. Android中添加背景音乐的两种方法

    前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...

  5. 域用户迁移适用的两种方法

    在企业域林环境中,域用户的调动变更情况会经常遇到,面对这样的棘手问题,我们解决域用户迁移主要有两种方法:一种是使用微软ADMT2.0工具把域用户进行迁移:另一种是采取建立新用户把原有权限复制过来,再把 ...

  6. JS实现星星评分功能实例代码(两种方法)

    转载自   JS实现星星评分功能实例代码(两种方法) 一.方法1 1.用到图片 2.结构和样式 <!DOCTYPE html> <html lang="en"&g ...

  7. Linux安装MySQL的两种方法

    原文链接:http://blog.csdn.net/superchanon/article/details/8546254 -------------------------------------- ...

  8. java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

    首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...

  9. qt连接mysql数据库原理_Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

最新文章

  1. Javascript获取页面、屏幕尺寸大小参数
  2. js经典试题之ES6
  3. 【BUG调试】——OSError: Caught OSError in DataLoader worker process 0
  4. ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???
  5. 【Virtual DOM】虚拟 DOM 和 Snabbdom 库
  6. linux下硬盘安装ubuntu,Ubuntu硬盘安装
  7. VS2013.3 VS2014 任务资源管理器
  8. [20160325]bbed是否有4G的限制.txt
  9. linux执行ksh文件,关于linux:KSH shell,它对目录中的文件行进行计数
  10. java B2B2C Springboot电子商城系统-eureka详解
  11. vmware下ubuntu不能上网 = 恢复默认虚拟网络
  12. Git下载安装及基本配置
  13. UI - PS如何导入不同的字体
  14. QSS实践汇总(3)——QComboBox样式(风格)
  15. 一个老程序员的教诲(2)
  16. Android面试题之动画+事件处理篇
  17. C#求解一元二次方程的根
  18. 技术重要还是业务重要_重要主题
  19. 【程序】Marvell 88W8782/88W8801 WiFi模块创建或连接热点,并使用lwip2.1.3建立http服务器(20220213版)
  20. 锐浪(Grid++Report)报表脚本通过某些字段隐藏控件

热门文章

  1. linux grep命令详解_Linux 上USB 调试神器lsusb命令详解
  2. 窗口管理器 实现_「42」Python布局管理器(三):place实现组件的精确与灵活布局...
  3. java魂斗罗_java 魂斗罗
  4. OpenCASCADE:MFC示例
  5. wxWidgets:图像面板image panel
  6. boost::process::posix相关的测试程序
  7. boost::phoenix::function相关的测试程序
  8. boost::mp11::mp_eval_if_q相关用法的测试程序
  9. boost::mp11::mp_copy_if相关用法的测试程序
  10. boost::fusion::traits::is_view用法的测试程序