组合与聚合对比:

组合: 同生共死 ( 生命周期一致 )

聚合: 有聚有散 ( 生命周期随分配 )

一.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++】多态之组合与聚合相关推荐

  1. java依赖_java 依赖、组合、聚合与继承

    java中类与类之间的关系 大部分的初学者只知道java中两个类之间可以是继承与被继承的关系,可是事实上,类之间的关系大体上存在五种-继承(实现).依赖.关联.聚合.组合. 接下来,简单的分析一下这些 ...

  2. 组合、聚合、继承详解

    有人学了继承,认为他是面向对象特点之一,就在所有能用到继承的地方使用继承,而不考虑究竟该不该使用,无疑,这是错误的.那么,究竟该如何使用继承呢? java中类与类之间的关系 大部分的初学者只知道jav ...

  3. Java中的组合、聚合和关联关系

    1.介绍 对象之间在现实生活和编程中都有关系.有时很难理解或实现这些关系. 在本教程中,我们将重点介绍 Java 的三种关系类型,这些关系有时很容易混合:组合.聚合和关联. 2.组合 组成是一种&qu ...

  4. 【简单易懂】c++中组合与聚合

    组合:即不十分相关的东西,集成在一起.譬如:电脑是一个类,由鼠标.键盘.显示器.主机这4个类组合而成,可插拔.实现中:一般为传参数. 聚合:即类的本身属性,密不可分割.譬如:人是一个类,由手臂.大腿. ...

  5. 建模的常用手段:组合与聚合

    文章目录 1 组合 1.1 组合的基本概念 1.2 组合的具体方式 1.3 组合的具体实例 2 聚合 2.1 聚合的基本概念 2.2 聚合的具体实例 1 组合 1.1 组合的基本概念 当两个对象之间是 ...

  6. 用多态和组合替换多个条件

    这是一种众所周知的重构模式,可以将条件条件替换为多态性. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦该类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些有关如何使用这 ...

  7. 组合,聚合,关联,依赖的区别

    依赖(Dependency) 在C++中体现为局部变量.方法/函数的参数或者是对静态方法的调用 图示为: 关联(Association) 体现在C++中,关联关系是通过成员变量来实现的 图示为: 聚合 ...

  8. Python笔记(二十)_多态、组合

    多态 对于一个函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就 ...

  9. C++之类的组合(聚合)

    在我们对现实中的某些事物抽象成类时,可能会形成很复杂的类,为了更简洁的进行软件开发,我们经常把其中相对比较独立的部分拿出来定义成一个个简单的类,这些比较简单的类又可以分出更简单的类,最后由这些简单的类 ...

最新文章

  1. Jenkins:配置信息变更历史
  2. 运动,由Silverlight助力 / Sports, Powered by Silverlight
  3. linux 修改超级权限密码,linux 修改用户密码
  4. redis编译包下载地址 redis-6.2.6.tar.gz
  5. 如何设计第三方账号登陆?
  6. [数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)
  7. Java Calendar 基本用法
  8. sklear中IsolationForest的使用场景
  9. 一个关于 TensorFlow 的悲剧故事
  10. mesh threejs 属性_ThreeJS拖动案例解析
  11. Ansible详解(十二)——Ansible Roles详解
  12. jQuery报错:Uncaught ReferenceError: $ is not defined
  13. 中国移动云能力中心 高薪诚聘各路运维技术专家
  14. EL属性范围用法sessionScope等(转)
  15. 用数据,创造下一个可能
  16. OLS最小二乘法和2SLS两阶段…
  17. monkeyrunner之环境搭建及实例(三)
  18. 《童趣》——《所见》《小儿垂钓》《村居》《浮生六记·童趣》 ——诗文诵读教学设计
  19. postgresql中mysql外表建立
  20. SOLIDWORKS产品设计学习

热门文章

  1. 如何使用谷歌浏览器进行Debug断点调试
  2. 万字干货 | 用游戏高手的用户洞察法,如何复制一个拼多多
  3. 2009 中国七夕情人节 --期待
  4. 计算机一直在启动界面进不去怎么办,Win7系统开机一直停留在“Windows正在启动”界面怎么办...
  5. Go语言核心之美 1.2-变量及声明篇
  6. FPS显示和修改——unity3D
  7. 编写lisp程序解一元二次方程_vb解一元二次方程代码
  8. 五层体系结构特点及其功能
  9. 秋水仙碱与牛血清白蛋白 (BSA)偶联物(相关实验)
  10. PHP人才匮乏,月入万元不是梦