【C++】多态之组合与聚合
组合与聚合对比:
组合: 同生共死 ( 生命周期一致 )
聚合: 有聚有散 ( 生命周期随分配 )
一.Computer与Cpu组合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuKQtZTc-1587262856672)(file:///C:\Users\Dell\AppData\Local\Temp\ksohtml23044\wps1.jpg)]
Computer.h
#pragma once
#include <iostream>
using namespace std;#include "Cpu.h"//include组合拥有的类的头文件
class VoiceBox;//声明提及的类class Computer{public:Computer();Computer(int hardDisk, int memory, const char* cpuBrand, const char* cpuVersion);~Computer();void addVoiceBox(VoiceBox* box);
private:Cpu cpu;//组合拥有的类的对象//Cpu* cpu;不推荐用指针,因为数量确定,不必动态分配(动态分配还需要为防内存泄漏,另写拷贝赋值构造,麻烦)//Cpu* cpu2;若数量不定,应使用指针动态分配VoiceBox* box;//聚合的对象指针,可以不初始化,因为不一定聚合,若聚合一定要给地址int hardDisk;int memory;
};
Computer.cpp
#include "Computer.h"Computer::Computer():cpu() {//若函数参数都为默认参数,那么可以不写任何参数
//Computer::Computer(){不推荐用指针对象this->hardDisk = 0;this->memory = 0; cout << __FUNCTION__ << endl;//this->cpu = new Cpu();不推荐用指针对象//this->cpu2 = new Cpu();
}
Computer::Computer(int hardDisk, int memory, const char* cpuBrand, const char* cpuVersion):cpu(cpuBrand, cpuVersion){//Computer::Computer(int hardDisk, int memory, const char* cpuBrand, const char* cpuVersion){不推荐用指针对象this->hardDisk = hardDisk;this->memory = memory;cout << __FUNCTION__ << endl;//this->cpu = new Cpu(cpuBrand,cpuVersion);不推荐用指针对象//this->cpu2 = new Cpu(cpuBrand,cpuVersion);不推荐用指针对象
}
Computer::~Computer() {//要delete也只能delete自己拥有的//delete cpu;不推荐用指针对象//delete cpu2;不推荐用指针对象cout << __FUNCTION__ << endl;
}
void Computer::addVoiceBox(VoiceBox *box) {this->box = box;
}
Cpu.h
#pragma once
#include <iostream>
using namespace std;class Cpu{public://Cpu(char *brand="dell", int version= 2);×-记得用const类型-因默认参数为const类型Cpu(const char* brand = "dell", const char* version = "xps");~Cpu();
private:string brand;string version;
};
Cpu.cpp
#include "Cpu.h"Cpu::Cpu(const char* brand, const char* version) {//默认值在实现部分不写this->brand = brand;//brand若为char*型则此等式无法成立this->version = version;cout << __FUNCTION__ << endl;
}
Cpu::~Cpu() {cout << __FUNCTION__ << endl;
}
二.Computer与VoiceBox聚合
VoiceBox.h
#pragma once
#include <iostream>
using namespace std;
class VoiceBox
{public:VoiceBox();~VoiceBox();
};
VoiceBox.cpp
#include "VoiceBox.h"VoiceBox::VoiceBox() {cout << __FUNCTION__ << endl;
}
VoiceBox::~VoiceBox() {cout << __FUNCTION__ << endl;
}
三.测试文件与打印效果
#include "Computer.h"
#include "VoiceBox.h"//因不是拥有关系,所以在main中还要加上聚合的类的头文件void testCombination() {Computer a;//注意不要自己乱搞在后面加括号,加括号代表调用带参函数的默认值//Computer a();×
}void testAggregate(VoiceBox* box) {Computer a;a.addVoiceBox(box);
}//在块末尾Computer与Cpu共死int main(){cout << "------1.组合------" << endl;testCombination();cout << "------2.聚合------" << endl;VoiceBox box;testAggregate(&box);system("pause");//也可cout<<"end"<<endl;//int main函数可以不写返回值;也可写void main
}//在块末尾VoiceBox才析构"------2.聚合------" << endl;VoiceBox box;testAggregate(&box);system("pause");//也可cout<<"end"<<endl;//int main函数可以不写返回值;也可写void main
}//在块末尾VoiceBox才析构
【C++】多态之组合与聚合相关推荐
- java依赖_java 依赖、组合、聚合与继承
java中类与类之间的关系 大部分的初学者只知道java中两个类之间可以是继承与被继承的关系,可是事实上,类之间的关系大体上存在五种-继承(实现).依赖.关联.聚合.组合. 接下来,简单的分析一下这些 ...
- 组合、聚合、继承详解
有人学了继承,认为他是面向对象特点之一,就在所有能用到继承的地方使用继承,而不考虑究竟该不该使用,无疑,这是错误的.那么,究竟该如何使用继承呢? java中类与类之间的关系 大部分的初学者只知道jav ...
- Java中的组合、聚合和关联关系
1.介绍 对象之间在现实生活和编程中都有关系.有时很难理解或实现这些关系. 在本教程中,我们将重点介绍 Java 的三种关系类型,这些关系有时很容易混合:组合.聚合和关联. 2.组合 组成是一种&qu ...
- 【简单易懂】c++中组合与聚合
组合:即不十分相关的东西,集成在一起.譬如:电脑是一个类,由鼠标.键盘.显示器.主机这4个类组合而成,可插拔.实现中:一般为传参数. 聚合:即类的本身属性,密不可分割.譬如:人是一个类,由手臂.大腿. ...
- 建模的常用手段:组合与聚合
文章目录 1 组合 1.1 组合的基本概念 1.2 组合的具体方式 1.3 组合的具体实例 2 聚合 2.1 聚合的基本概念 2.2 聚合的具体实例 1 组合 1.1 组合的基本概念 当两个对象之间是 ...
- 用多态和组合替换多个条件
这是一种众所周知的重构模式,可以将条件条件替换为多态性. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦该类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些有关如何使用这 ...
- 组合,聚合,关联,依赖的区别
依赖(Dependency) 在C++中体现为局部变量.方法/函数的参数或者是对静态方法的调用 图示为: 关联(Association) 体现在C++中,关联关系是通过成员变量来实现的 图示为: 聚合 ...
- Python笔记(二十)_多态、组合
多态 对于一个函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就 ...
- C++之类的组合(聚合)
在我们对现实中的某些事物抽象成类时,可能会形成很复杂的类,为了更简洁的进行软件开发,我们经常把其中相对比较独立的部分拿出来定义成一个个简单的类,这些比较简单的类又可以分出更简单的类,最后由这些简单的类 ...
最新文章
- Jenkins:配置信息变更历史
- 运动,由Silverlight助力 / Sports, Powered by Silverlight
- linux 修改超级权限密码,linux 修改用户密码
- redis编译包下载地址 redis-6.2.6.tar.gz
- 如何设计第三方账号登陆?
- [数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)
- Java Calendar 基本用法
- sklear中IsolationForest的使用场景
- 一个关于 TensorFlow 的悲剧故事
- mesh threejs 属性_ThreeJS拖动案例解析
- Ansible详解(十二)——Ansible Roles详解
- jQuery报错:Uncaught ReferenceError: $ is not defined
- 中国移动云能力中心 高薪诚聘各路运维技术专家
- EL属性范围用法sessionScope等(转)
- 用数据,创造下一个可能
- OLS最小二乘法和2SLS两阶段…
- monkeyrunner之环境搭建及实例(三)
- 《童趣》——《所见》《小儿垂钓》《村居》《浮生六记·童趣》 ——诗文诵读教学设计
- postgresql中mysql外表建立
- SOLIDWORKS产品设计学习
热门文章
- 如何使用谷歌浏览器进行Debug断点调试
- 万字干货 | 用游戏高手的用户洞察法,如何复制一个拼多多
- 2009 中国七夕情人节 --期待
- 计算机一直在启动界面进不去怎么办,Win7系统开机一直停留在“Windows正在启动”界面怎么办...
- Go语言核心之美 1.2-变量及声明篇
- FPS显示和修改——unity3D
- 编写lisp程序解一元二次方程_vb解一元二次方程代码
- 五层体系结构特点及其功能
- 秋水仙碱与牛血清白蛋白 (BSA)偶联物(相关实验)
- PHP人才匮乏,月入万元不是梦