Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别

简介:

在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合。其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Polymorphism之一。

继承Inheritance:是指一个类(子类)来继承另一个类(基类),并增加自己的功能,可以通过重写基类中的函数来实现。可以将继承理解成“IS A”的关系,比如A cat "IS A" animal, or A car "IS A" vehicle.

关联Association:是类之间很弱的一种联系,在C++中表现为一个类作为另一个类方法的参数,比如:

class A;
class B;
A::Function1(B &b);
A::Function2(B b);
A::Function3(B *b);

聚合Aggregation:指的是整体和部分的关系,通过从别的类中拿来函数来组成一个新类,或在新类中添加其他代码的一个常用的接口Interface。可以将聚合理解成“HAS A”, 比如 A car "HAS A" engine, or A person "HAS A" name.

Inheritance v.s. Aggregation: 我们有时候会犹豫何时该用继承,何时该用聚合,通常来说,当一个接口Interface的部分不需要使用或是应该被修改以避免不合逻辑的情况时,我们需要用聚合。假如我们需要用几乎所有的函数而并不需要太大的改变时,使用继承。

组合Composition:和聚合类似,也是表示整体和部分的关系,但不同的是,整体和部分具有统一的生存期,一旦整体不存在了,部分也就没有了。可以将组合理解成“CONTAIN A", 比如地球和人的关系,假如地球毁灭了,那么人类也就玩完了,这是组合的关系。那么聚合的关系就好比主机和其外设,即使主机挂了,外设也可以连到其他机子上使用。在C++中,比如:

class A;
class B { A *a; ... };
class C { A a; ... };

本文转自博客园Grandyang的博客,原文链接:类的继承,关联,聚合和组合的区别Inheritance, Association, Aggregation, and Composition,如需转载请自行联系原博主。

相关文章
|
JavaScript 安全 定位技术
vue3实现高德地图多点标注(so easy)
vue3实现高德地图多点标注(so easy)
1732 0
|
设计模式 架构师 大数据
我的架构师之路——阿里云 MVP 沈剑
沈剑,公众号“架构师之路”的作者,曾任百度高级工程师和58同城高级架构师、技术委员会主席、技术学院优秀讲师,现为到家集团技术委员会主席和技术VP,同时也是快狗打车(原58速运)的CTO。本文是沈剑老师在阿里云的直播中分享的一些自己关于架构师的看法和成为架构师的心路历程的第一部分。
6942 0
我的架构师之路——阿里云 MVP 沈剑
|
NoSQL Linux 编译器
Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
交叉编译gdb和gdbserver 1、下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本。当然,凡事无绝对。我们以gdb-7.2.tar.bz2 这个文件为例。
8009 1
|
缓存 开发工具 git
【git】解决:remote: Permission to xxxx/xxxx.git denied to xxxx
【git】解决:remote: Permission to xxxx/xxxx.git denied to xxxx
1263 0
|
10月前
|
人工智能 机器人 API
搞定!微信接入DeepSeek打造聊天机器人,1行代码就行!
程序员晚枫分享了一个有趣的Python项目,将DeepSeek大模型接入微信,实现自动聊天。通过PyOfficeRobot库,仅需1行代码即可完成接入,打造AI聊天机器人。该项目基于Windows API操作微信,目前仅支持Windows系统。用户需填写好友名称和API Key,轻松体验AI对话。此外,PyOfficeRobot还支持其他大模型如阿里通义、智谱等。欢迎尝试并参与改进开源项目。
1370 81
搞定!微信接入DeepSeek打造聊天机器人,1行代码就行!
|
人工智能 机器人 vr&ar
Find3D:加州理工学院推出的3D部件分割模型
Find3D是由加州理工学院推出的3D部件分割模型,能够根据任意文本查询分割任意对象的任何部分。该模型利用强大的数据引擎自动从互联网上的3D资产生成训练数据,并通过对比训练方法训练出一个可扩展的3D模型。Find3D在多个数据集上表现出色,显著提升了平均交并比(mIoU),并能处理来自iPhone照片和AI生成图像的野外3D构建。
223 5
Find3D:加州理工学院推出的3D部件分割模型
|
机器学习/深度学习 Python
【Python】已解决:ModuleNotFoundError: No module named ‘paddle’
【Python】已解决:ModuleNotFoundError: No module named ‘paddle’
1762 1
|
Java 开发工具 Android开发
RK3288 android7.1 蓝牙MAC地址获取
RK3288 android7.1 蓝牙MAC地址获取
453 0
RK3288 android7.1 蓝牙MAC地址获取
|
算法 C++ 开发者
【Conan 入门问题】处理子文件夹中的conanfile.py
【Conan 入门问题】处理子文件夹中的conanfile.py
297 1
|
存储 NoSQL 关系型数据库
什么是列存储?一文秒懂
什么是列存储?一文秒懂
2454 1