在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; ... };

如上所示,类A和类B是聚合关系,因为B包含了A的指针,即使B销毁了,A还会在。而类A和类C是组合关系,C包含了A的对象,C一旦销毁,A也就不复存在了。

参考资料:

http://blog.csdn.net/daxiamit/article/details/6433678

http://stackoverflow.com/questions/269496/inheritance-vs-aggregation

http://stackoverflow.com/questions/5543288/inheritance-vs-aggregation-and-has-a-vs-is-a

Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别的更多相关文章

  1. UML类关系:依赖,关联,聚合和组合

    UML图示例:(可使用StartUML来画图,小巧^_^) http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 聚合:表 ...

  2. 关联,聚合和组合(复合)--Association, Aggregation and Composition

    概要 Association, Aggregation and Composition are terms that represent relationships among objects. Th ...

  3. Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

    一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...

  4. python入门 类的继承和聚合(五)

    继承 class Rocket: def __init__(self, name, distance): self.name = name self.distance = distance def l ...

  5. UML类图-聚合和组合的区别

    类图-组合和聚合 学习自 http://blog.sina.com.cn/s/blog_4ae8f77f0100ji5k.html http://blog.csdn.net/nodeathphoeni ...

  6. UML类关系(依赖,关联,聚合,组合,泛化,实现)

    转自https://blog.csdn.net/k346k346/article/details/59582926   在学习面向对象设计时,类关系涉及依赖.关联.聚合.组合和泛化这五种关系,耦合度依 ...

  7. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  8. c++ 继承和组合的区别

    .什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会. .什么是组合 若在逻辑上A是B的“ ...

  9. [UML]UML系列——类图class的关联关系(聚合、组合)

    关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code/assocation) 假设:一个公司 ...

随机推荐

  1. Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  2. yum缓存配置

    引自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/09/2203916.html $ cat /etc/yum.conf    ...

  3. mysql 我的学习

    安装要求 安装环境:CentOS-6.3安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz下载地址:http://mysql ...

  4. BestCoder12 1002.Help him(hdu 5059) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目意思:就是输入一行不多于 100 的字符串(除了'\n' 和 '\r' 的任意字符),问是否 ...

  5. CodeForces - 405A

    Gravity Flip Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  6. July 31st, Week 32nd Sunday, 2016

    If you wept for the missing sunset, you would miss all the shining stars. 如果你为错过夕阳而哭泣,那你有可能也会错过灿烂的星空 ...

  7. Google map测量工具

    启用Google map的测量工具,测量图上的距离. 打开Google map,左下角看到Google 地图实验室,点开,然后enable相应功能即可. 通过Google map lab还能使我们能够 ...

  8. 取余运算(codevs 1497)

    题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长整型数(2^31范围内). 输入描述 Input Description b p k 输出描 ...

  9. loj 1108(spfa判负环)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26823 思路:题目的意思是求出所有的能够到达负环的点.负环很好求, ...

  10. mtr命令

    mtr 命令详解 一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由,在Linux中有一个更好的网络连通性判断工具,它可以 ...