美文网首页C++基础知识
C++中的继承、组合、聚合和关联

C++中的继承、组合、聚合和关联

作者: 安然_fc00 | 来源:发表于2017-04-19 14:36 被阅读88次

本文转载自:
http://blog.csdn.net/kkforwork/article/details/46225747

一、继承、组合和聚合

继承和组合是两个完全不同的概念
继承,表达的是“is-a”的关系,两者之间是一种上下级的关系,比如,我们说“human is a animal“(人是动物的一种,换句话说,动物是人的上级),要表达这种关系,就可以使用继承

calss animal
{};
class human : public animal  // 继承
{};

组合和聚合,则是表达两个平等对象之间整体和局部的关系,而因为这种关系的紧密性的不同,而又分为了组合和聚合。组合表达的是“contain-a”的关系,整体和局部拥有相同的生命周期,换句话说,如果整体对象不存在了,那么局部对象也会消亡。在C++中,我们通常在整体类中加入一个局部类的对象作为其成员,来表达这种组合关系(整体对象创建的同时,也会创建局部对象,而整体对象消失了,局部对象也会消失),比如,我们说“human conains a head”(人有一个脑袋,人活着,脑袋也活着,如果人死了,脑袋也就是了),

class head
{};
calss human
{
private:
    head h;  // 数据成员对象表示的组合关系
}

聚合同样表的是整体和局部的关系,但是这种关系要松散得多,它表达的是一种“has-a”的关系,整体和局部拥有各自的生命周期,两者可以单独存在,相互独立,并不像组合一样两者相互依存,但两者也可以聚合在一起,形成一个新的类型。比如,我们说“human has a computer”(人有一台电脑,电脑和人都是各自独立的,而两者聚合在一起,就成了“有电脑的人”),在C++中,我们通常在整体类中加入指向局部类的指针,来表达这种“聚合”关系(整体对象创建的时候,不一定有局部对象,可能已经创建,也可以还没有,而整体对象消失了,局部对象还可以继续存在,也可能消失,想象一下电脑和人的关系,生不带来,死不带去)。

calss computer
{};
class human
{
// ...
private:
    computer* pCom; // 指针表示的聚合关系
};

总结起来,继承表达的是一种上下级的关系(is-a),聚合表达的是一种松散的整体和局部的关系(has-a),而组合表达的是一种紧密的整体局部关系(contain-a)
另外:

class A{
private:
    B* p_b;
};
A::A(){
    p_b=new B;
}
A::~A(){
    delete p_b;
}

A与B的关系是组合。虽然是用指针表示的,依然是组合关系。
到底是组合还是聚合,其实现形式(用成员还是指针)不是判断标准,两者生命周期的差异,才是判断标准。两者生命周期相同的,是组合,比如成员变量,你这里用指针的实现,而生命周期不同的,才是聚合。

二、关联和聚合

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。
聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。

相关文章

  • C++中的继承、组合、聚合和关联

    本文转载自:http://blog.csdn.net/kkforwork/article/details/4622...

  • UML(unified modeling language)常用

    继承 实现 关联 依赖 组合 聚合 是醉常用的统一建模语言常用的类关系个人理解:聚合和组合属于关联的子类,聚合和组...

  • UML图的基础

    一、 基础关系 依赖关系依赖关系 实现关系实现关系 继承关系继承关系 组合关系组合关系 聚合关系聚合关系 关联关系...

  • uml类图难点摘要

    is a 继承 use a 依赖: 使用关系 关联(association):包括聚合 和组合 n:n的关系 ha...

  • 类和类之间的关系之继承

    继承 实现 (A is-a B) 也叫作泛化 组合 聚合 关联 (A) 依赖 继承 子类 => 父类 ...

  • java 中关于依赖,关联,聚合,组合之前的区别理解

    依赖 --- 局部变量,方法的形参,静态方法 关联 ,聚合,组合--- 成员变量聚合和组合都是关联的一种聚合和组合...

  • 聚合与组合的关系

    一、概述 UML类图中的关系主要是(按照耦合度递增的顺序): 依赖 关联 聚合 组合 继承 聚合和组合从本质上讲都...

  • 01.UML类图

    强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖 泛化(Generalization) 子类继承...

  • 类之间的关系

    类之间的关系: 依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。

  • 《架构设计: 基础 UML 类图》

    类之间得关系 1、关联关系单向关联双向关联自关联 2、聚合关系 3、组合关系 4、继承关系 5、实现关系 6、依赖...

网友评论

    本文标题:C++中的继承、组合、聚合和关联

    本文链接:https://www.haomeiwen.com/subject/rnthzttx.html