C++实现has-a关系的两种方法
**•组合(或包含)方式。**这是我们通常采用的方法。
**•c++还有另一种实现has-a关系的途径—私有继承。**使用私有继承,基类的公有成员和保护成员都将称为派生类的私有成员。这意味着基类方法将不会称为派生对象公有接口的一部分,但可以派生类的成员函数中使用它们。而使用公有继承,基类的公有方法将称为派生类的公有方法。简言之,派生类将继承基类的接口:这是is-a关系的一部分。使用私有继承,基类的公有方法将称为派生类的私有方法,即派生类不继承基类的接口。正如从被包含对象中看到的,这种不完全继承是has-a关系的一部分。 使用私有继承,类将继承实现。例如,如果从String类派生出Student类,后者将有一个String类组件,可用于保存字符串。另外,Student方法可以使用String方法类访问String组件。
包含将对象作为一个命名的成员对象添加到类中,而私有继承将对象作为一个未被命名的继承对象添加到类中。我们使用术语子对象来表示同继承或包含添加的对象。 因此,私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
•使用包含还是使用私有继承? 由于既可以使用包含,也可以使用私有继承来建立has-a关系,那么应使用何种方式呢?大多数C++程序员倾向于使用包含。
–首先,它易于理解。类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象,而使用继承将使关系更抽象。
–其次,继承会引起很多问题,尤其从多个基类继承时,可能必须处理很多问题,如包含同名方法的独立的基类或共同祖先的独立基类。 总之,使用包含不太可能遇到这样的麻烦。
–另外,包含能够包
C++实现has-a关系的两种方法相关推荐
- 用两种方法改错,体会封装和友员的关系!
用两种方法改错,体会封装与友员的关系. #include<iostream.h> Class Animal; void setValue(Animal & pa,int pw) { ...
- 从上升边和带宽关系的两种公式说起
上升边时间和信号带宽的关系,不同的资料里,遇到过两种公式表达: 关于这两个公式,也有转折频率的说法,即脉冲的大部分能量集中在转折频率以下,有效频率分量,转折频率,只是说法不同罢了. 为什么会有两个公式 ...
- 004 两种方法找寻路call
文章目录 关于寻路call 通过参数找寻路call CE搜索寻路目的地坐标 通过参数定位寻路call 寻路call参数分析 寻路call代码测试 寻路状态找寻路call 搜索寻路标志位 通过寻路标志位 ...
- Android中添加背景音乐的两种方法
前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...
- 域用户迁移适用的两种方法
在企业域林环境中,域用户的调动变更情况会经常遇到,面对这样的棘手问题,我们解决域用户迁移主要有两种方法:一种是使用微软ADMT2.0工具把域用户进行迁移:另一种是采取建立新用户把原有权限复制过来,再把 ...
- JS实现星星评分功能实例代码(两种方法)
转载自 JS实现星星评分功能实例代码(两种方法) 一.方法1 1.用到图片 2.结构和样式 <!DOCTYPE html> <html lang="en"&g ...
- Linux安装MySQL的两种方法
原文链接:http://blog.csdn.net/superchanon/article/details/8546254 -------------------------------------- ...
- java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法
首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...
- qt连接mysql数据库原理_Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...
最新文章
- Javascript获取页面、屏幕尺寸大小参数
- js经典试题之ES6
- 【BUG调试】——OSError: Caught OSError in DataLoader worker process 0
- ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???
- 【Virtual DOM】虚拟 DOM 和 Snabbdom 库
- linux下硬盘安装ubuntu,Ubuntu硬盘安装
- VS2013.3 VS2014 任务资源管理器
- [20160325]bbed是否有4G的限制.txt
- linux执行ksh文件,关于linux:KSH shell,它对目录中的文件行进行计数
- java B2B2C Springboot电子商城系统-eureka详解
- vmware下ubuntu不能上网 = 恢复默认虚拟网络
- Git下载安装及基本配置
- UI - PS如何导入不同的字体
- QSS实践汇总(3)——QComboBox样式(风格)
- 一个老程序员的教诲(2)
- Android面试题之动画+事件处理篇
- C#求解一元二次方程的根
- 技术重要还是业务重要_重要主题
- 【程序】Marvell 88W8782/88W8801 WiFi模块创建或连接热点,并使用lwip2.1.3建立http服务器(20220213版)
- 锐浪(Grid++Report)报表脚本通过某些字段隐藏控件
热门文章
- linux grep命令详解_Linux 上USB 调试神器lsusb命令详解
- 窗口管理器 实现_「42」Python布局管理器(三):place实现组件的精确与灵活布局...
- java魂斗罗_java 魂斗罗
- OpenCASCADE:MFC示例
- wxWidgets:图像面板image panel
- boost::process::posix相关的测试程序
- boost::phoenix::function相关的测试程序
- boost::mp11::mp_eval_if_q相关用法的测试程序
- boost::mp11::mp_copy_if相关用法的测试程序
- boost::fusion::traits::is_view用法的测试程序