【复习】C++之类之间的关系

类间的关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。

====================================================================================================

纵向关系就是继承关系。

类的继承,是新的类从已有类的那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。

一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类,称为单继承。

继承方式规定了如何访问基类继承的成员。继承方式有public,private,protected。如果不给出继承方式,默认为private继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。

public继承,访问修饰符没有变化的。

protected继承,访问修饰符public成员变成protected成员。

private继承,访问修饰符public成员和protected成员变成private成员。

无论什么继承,private在子类中都不可访问。

除了private成员,无论怎么继承在子类都能使用。

派生类继承基类中除构造和析构函数以外的所有成员。

继承关系中,要执行父类的指定的构造函数也需要在初始化列表中。

子类重写父类的函数,名字和参数列表要与父类一样。

当父类的指针指向一个子类的对象时,能使用的只有父类的成员。

子类中由父类继承而来的成员的初始化工作还是由父类的构造函数完成,然后子类中新增的成员在子类的构造函数中初始化。

构造函数的初始化顺序根据声明的顺序初始化。

子类执行构造函数执行次序:调用父类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右);调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序;子类的构造函数体中的内容。

子类的析构函数的功能是在该对象消亡之前进行一些必要的清理工作,析构函数没有类型,也没有参数。析构函数的执行顺序与构造函数相反。

重载:指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。只要是同名函数,不管参数列表是否相同,基类函数都会被隐藏。

重写:指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一直。只有函数体不同,派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

重载和重写的区别:

范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中;

参数区别:参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同;

virtual的区别:重写的基类必须要有virtual修饰。

隐藏和重写,重载的区别:

与重载范围不同:隐藏函数和被隐藏函数在不同类中。

参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定相同。当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。

====================================================================================================

横向关系比较微妙,按照UML的建议大体上可以分为四种:

1.依赖

2.关联

3.聚合

4.组合

1.依赖:

所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,并不持有对它的引用。

例如,人需要空气,一个人自创建出来就需要不停的呼吸,而人的呼吸功能之所以能维持生命就在于吸进来的气体发挥了作用,所以说空气是人类的一个工具,而人并不持有对它的引用。

2.关联:平等的朋友关系

所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。

例如,人从生至死都在不断交朋友,然而没有理由认为朋友的生死与我的生死有必然的联系,所以他们的生命期没有关联,我的朋友又可以是别人的朋友,所以朋友可以共享。

3.聚和:所属关系

聚和是强版本的关联。它暗含着一种所属关系以及生命期关系。被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系。

例如,我和我的家之间具有着一种强烈的所属关系,我的家是可以分享的,而这里的分享又可以有两种,一种是聚合间的分享,着正如你和你爱人都对这个家有着同样强烈关联;一种是聚合与关联的分享,如果你的朋友来家里吃个便饭,就是临时的分享。

4.组合

组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。被包含的对象还可以再被别的对象关联,所以被包含对象是可以共享的,然而绝不存在两个对象对同一个被包含对象的共享。

组合关系就是整体与部分的关系,部分属于整体,整体不存在,部分一定不存在,然而部分不存在整体是可以存在的,说的明确一些就是部分必须创生于整体之后,而销毁与整体销毁之前。部分在这个生命期内可以被其他对象关联甚至聚合,但有一点必须注意,一旦部分所属于的整体销毁了,那么与之关联的对象中的引用就会成为空引用,这一点可以利用程序来保障。

心脏的生命期与人的生命期是一致的,如果换个部分就不一定,比如阑尾。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值