【11】继承(一)

版权声明:zhuhurry 未经博主允许不得转载    https://blog.csdn.net/zhuhurry

 

 

一、继承简介

继承性是面向对象程序设计最重要的特征,可以说,不掌握继承就不等于掌握类和对象的精华,所以说继承是C++中很重要的一部分。

通过继承,我们可以用原来的数据类型来定义一个新的数据类型,定义的新类型既有原来数据中的成员,也能自己添加新的成员。

继承的时候,除了构造函数、析构函数、=运算符等特殊函数,我们继承了基类的其他所有的成员函数和成员变量。

我们一般把原来的数据类型称为基类或者父类,新的数据类型为派生类,或者子类。

class 派生类名 : 继承方式 基类名

{

派生类新增成员的声明;

}

 

三种继承方式

在C++中有,公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

1.公有继承

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

2.保护继承

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

3.私有继承

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

在继承中不管是单继承还是多继承,都要注明继承方式,如果不注明在class中默认为private继承,在struct中默认public继承

 

二、函数的重载、重写、重定义

1.重载overload

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数

作用域相同

函数名相同

参数不同

注意:仅仅返回值不同是无法构成重载的

 

2.重写overwrite

函数重写其实就是函数覆盖,当你在派生类中声明了一个与基类函数的函数名、返回值、参数列表完全相同的成员函数时,你就已经将基类函数重写了。

①作用域不同(分别处于基类和派生类,也就是它是在继承关系中才会存在的)

②函数名相同、参数列表、返回值必须相同(协变除外,这个后面会讲到)

③基类必须有virtual关键字,也就是基类要被重写的函数必须是虚函数

④访问权限修饰符可以不同(也就是是否构成重写与访问权限修饰符无关)

注意:被重写的函数不能是static(因为不存在静态的虚函数)

3.重定义override

子类重新定义父类中有相同名称的非虚函数(参数列表可以不同),重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。

①作用域不同(分别处于基类和派生类,也就是它是在继承关系中才会存在的)

②函数名必须相同,如果参数不同,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆)

③函数名必须相同,如果参数相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆),如果有就是变成重写了。

重写和重定义,当通过子类对象访问时感觉两者效果没有区别,但是重写可以实现多态,而重定义不行

 

三、继承,组合、聚合、关联

1.继承

前面已介绍,这不多说。表达的是“is-a”的关系,两者之间是一种上下级的关系,比如,我们说“human is a animal“(人是动物的一种,换句话说,动物是人的上级),要表达这种关系,就可以使用继承。

 

2.组合

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

 

3.聚合

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

 

4.关联

指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。

关联在C++中呈现为:

class A{...}

  class B{ ...}

 A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)

即一个类作为另一个类方法的参数。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值