C++第四次作业
类的继承与派生
一、定义:
1、保持已有类的特性而构造新类的过程交继承。
2、在已有类的基础上新增自己的特性而产生新类的过程称为派生。
注:继承和派生是同一过程从不同角度看。
二、目的:
1、继承的目的:实现设计与代码的重用。
2、派生的目的:当新问题出现,原有程序无法解决(或完全不能解决)时,需要对原有程序进行改造。
三、使用方式:
1、单继承时:
class派生类名:继承方式 基类名
{
成员声明;
}
2、多继承时:
class派生类名:继承方式1 基类名1,继承方式2 基类名2,……
{
成员声明;
}
注:多继承时需要把所有继承方式和基类列出。每一个“继承方式”只用于限制对紧随其后的基类的继承。
四、访问控制:
1、共有三种继承方式:(1)公有继承(2)私有继承(3)保护继承
2、不同继承方式影响主要体现在:
(1)派生类成员对基类成员的访问权限
(2)通过派生类对象对基类成员的访问权限。
3、访问属性:
(1)基类中public和protected成员的访问属性在派生类保持不变,但基类的private成员不可直接访问。
(2)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
(3)通过派生类的对象访问从基类继承的成员,只能访问public成员。
五、例子:
1、公有继承:
(1)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
(2)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类中的private成员。
(3)通过派生类的对象访问从基类继承的成员,只能访问public成员。
注:定义一个Point类,用于初始化私有成员x,y,以及执行move函数。
注:定义一个矩形类,回避了构造函数,新增一个初始化函数,对基类的私有成员,通过基类提供的共有接口initPoint,将x,y作为参数去调用initPoint。
注:主函数实现定义Rectangle类的对象,初始化位置,以及移动位置的操作,并进行输出。
***运行结果***
2、私有继承:
(1)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
(2)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类中的private成员。
(3)通过派生类的对象访问从基类继承的成员,只能访问public成员。
注:多定义了个move函数,基类的move函数用私有方式继承过来之后,变成私有的了,在内外不能访问,为了让客户提供公有接口,在Rectangle自己写一个move函数。同样的getX()函数getY()函数。
注:代码都是一样的,差别在于现在调用的函数都是派生类自己定义的函数,没有基类继承过来的函数。
3、保护继承:是介于公有和私有之间的一种继承方式。
(1)基类的public和protected成员都以protect身份出现在派生类中,但基类的private成员不可直接访问。
(2)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类中的private成员。
(3)通过派生类的对象不能直接访问从基类继承的任何成员。
protect成员的特点与作用:
(1)对建立其所在类对象的模块来说,它与private成员的性质相同。
(2)对于其派生类来说,它与public成员的性质相同。
(3)即实现了数据隐藏,又方便继承,实现代码的重用。
五、总结
共有继承是最常用的,私有和保护继承需慎用。但私有和保护继承在特定的情况下可以达到特殊的效果,但需要一定的程序设计经验多了,面向的问题多了再使用。