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

如上所示,类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

时间: 2024-12-18 10:10:35

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

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

UML图示例:(可使用StartUML来画图,小巧^_^) http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 聚合:表示两个对象之间是整体和部分的弱关系,部分的生命周期可以超越整体.如电脑和鼠标,就可以用一下图形表示: 组合:表示两个对象之间是整体和部分的强关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在.组合关系的“部分”,是不能在整体之间进行共享的.如人和眼睛的关系:不过,如果你要说,眼睛可以移植,是

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

一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点:扩展性差 面向对象的程序设计:核心是对象,对象是特征(变量)与技能(函数)的结合体,是一种上帝式的思维方式 优点:解决了程序的扩展性 缺点:可控性差 二.类和对象 以游戏举例,基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特

类的继承、派生、组合、菱形的继承、多态

类的继承 继承是一种新建的类的方式,新建的类成为子类,被继承的类称为父亲 继承的特性是:子类会遗传父亲的属性 继承是类与类之间的关系 使用继承目的,可以减少代码的咒余 在python中,父类和子类只有在继承的时候才会产生 继承是为了拿到父类的所有东西 class Parent_Foo: def __init__(self,first_name,money,car,house) self.first_name = first_name self.car = car self.house =hous

Day17:类的继承、派生、组合和接口

一.类的继承.派生和组合 继承是一种创建新类的方式,在Python中,新类可以继承一个或多个父类,父类又可称为基类或者超类,新建的类称为派生类或子类. 在Python3中,所有类都默认继承object,都是新式类.在Python2中,有经典类和新式类.没有继承object类以及object的子类的类都是经典类. 1.继承 Python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass clas

类的继承和派生

一.类的继承.派生和组合 继承是一种创建新类的方式,在Python中,新类可以继承一个或多个父类,父类又可称为基类或者超类,新建的类称为派生类或子类. 在Python3中,所有类都默认继承object,都是新式类.在Python2中,有经典类和新式类.没有继承object类以及object的子类的类都是经典类. 1.继承 Python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass clas

Day29:类的继承、派生、组合和接口

一.类的继承.派生和组合 继承是一种创建新类的方式,在Python中,新类可以继承一个或多个父类,父类又可称为基类或者超类,新建的类称为派生类或子类. 在Python3中,所有类都默认继承object,都是新式类.在Python2中,有经典类和新式类.没有继承object类以及object的子类的类都是经典类. 1.继承 Python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass clas

c++ 继承和组合的区别

1.什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会. 2.什么是组合 若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B. 例如眼(Eye).鼻(Nose).口(Mouth).耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye.Nose.Mouth.Ear组合而成,不是派生而成 3.继承的优点和缺点 优点: 容易进行新

Inheritance Of Python 类的继承

Inheritance OOP三要素之一,继承 人类和猫都继承自动物类. 个体继承自父母,集成了父母的一部分特征. 在面向对象的世界中,从父类继承,就可以直接拥有弗雷德属性和方法,这样可以减少代码,多复用.子类可以定义自己的属性和方法. 类的继承 对于python来讲,所有的祖先都是object,所有的类都继承自object class Animal: def __init__(self, name): self._name = name @property def name(self): re

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html http://sundensky.blog.163.com/blog/static/7728873420109299167434/ 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类关系