第9章继承机制.ppt
《第9章继承机制.ppt》由会员分享,可在线阅读,更多相关《第9章继承机制.ppt(44页珍藏版)》请在三一文库上搜索。
1、第9章 继承机制,1,本讲主要内容,继承与派生的基本概念 类的继承方式 单继承 多重继承 虚基类(重复继承),2,单派生,多重派生,一 继承的基本概念,1.继承与“is a”关系 继承的一个常见用途是表达不同类型对象的 “is a”关系。如一个圆“is a”形状,一个矩形“is a”形状,则circle_shape和rectangle_shape类可以从shape类中继承,这种属性称为“is a”关系。 在C+中,称circle_shape和rectangle_shape类是从基类shape中派生的。下图可以说明这一概念。,3,可以说,类的继承和派生的层次结构,是人们对自然界中的事物进行分类、
2、分析和认识的过程在程序设计中的体现。 是个性与共性的关系,4,2、继承机制,所谓继承(inheritance)就是利用已有的数据类型定义出新的数据类型。 利用类的“继承”,就可以将原来的程序代码重复使用,从而减少了程序代码的冗余度,符合软件重用的目标。所以说,继承是面向对象程序设计的一个重要机制。 在继承关系中,称被继承的类为基类(base class)(或父类),而把通过继承关系定义出来的新类称为派生类(derived class)(子类)。 由此可见,派生类既可以对基类的性质进行扩展,又可以进行限制,从而得到更加灵活、更加适用的可重用模块,大大缩短程序的开发时间。,5,3、继承的目的,假如
3、一个工作要求修改(或增强)原有程序的功能,并且原先程序是以OOP类方式实现的,那么该任务的实现有两种选择: (1)直接修改原有类,但采用这种方式时,修改过程中很可能会发生小错误,这样不仅无法增加原先类的功能,反而使原先程序无法恢复。 (2)为原先类定义一个派生类,由于派生类可继承基类的特性,因此,原先程序的功能可以保留,而将要扩充的功能放在派生类内,这样在调试阶段,可以只针对新设计的派生类进行调试,因此,即可保留原先的类继续使用,又可大大缩短扩充原有程序的时间。,6,4 派生类的声明和对象定义,设若干基类已经适当的构建,则新类追加于这些基类的声明格式分为两种形式: 一种是单继承,一种是多继承
4、class 派生类名: 继承方式 基类名1, 继承方式 基类名2, ,继承方式 基类名n 派生类的成员声明; ; 继承方式由关键字private,public,protected给出 声明中的“基类名”是已经存在的类的名称,“派生类名”是在已存在的类的基础上通过添加成员而得到的新类。当派生类只有一个直接基类的继承情况,称为单继承。当派生类同时有多个基类的继承情况,称为多继承。,7,5 派生类的生成过程,派生类生成过程中需要指定派生类的类名,继承方式和新增成员。 派生类的生成过程可分为三个步骤:吸收基类成员改造基类成员和添加新的成员。 吸收基类成员:将基类除构造函数和析构函数以外的成员全部接受。
5、 改造基类成员:根据继承方式决定基类成员在派生类中的访问控制问题。 添加新的成员:派生类新增成员是派生类不同于基类的地方,也是继承和派生机制的关键所在。,8,二、类的三种继承方式,(1) 对于一个类的成员有三种访问控制方式,分别为:private、public、protected (2)对于类的继承有三种继承方式: (私有继承)private、(公有继承)public、(保护继承)protected 对于派生类成员的访问控制属性由上面两条决定,9,P243表7-2-2的解释,下面是关于编译器继承方式的描述: 1). 对于任意继承方式,基类的私有成员对于派生类是“不可访问的”。 2). 对于公共
6、继承方式,基类的公共成员为派生类的公共成员,基类的保护成员为派生类的保护成员。 3). 对于保护继承方式,基类的公共的和保护的成员变为派生类的保护成员。 4). 对于私有继承方式,基类的公共的和保护的成员变为派生类的私有成员。,10,公有继承,11,private,protected,public,private,protected,public,原基类私有,原基类私有,公有继承时的属性变化,基类原访问属性,派生类访问属性,保护继承,12,private,protected,public,private,protected,public,原基类私有,原基类私有,保护继承时的属性变化,基类原访问
7、属性,派生类访问属性,私有继承,13,private,protected,public,private,protected,public,原基类私有,原基类私有,私有继承时的属性变化,基类原访问属性,派生类访问属性,几点声明,1 私有成员与不可访问成员是两个不同的概念。某个类的私有成员只能被该类的成员函数所访问,而类的不可访问成员甚至不能被该类自身的成员函数所访问(如:在私有继承中,派生类成员不能访问private部分) 。类的不可访问成员总是从某个基类派生来的,它要么是基类的私有成员,要么是基类的不可访问成员。,14,实例,15,class A private: int s; public:
8、 void set(int n) s=n; int gets() return s; ; class B:public A /类B以公有继承的方式继承类A的成员 private: int t; public: void sett(int n) t=n; int gett() return t*gets(); /通过基类的成员函数访问基类的私有成员 ;,main() B ob; ob.set(12); /通过类外的对象访问基类的公有成员 ob.sett(5); coutob.gett()endl; return 0; 运算结果:60 这里应注意两个问题: 虽然派生类以公有的方式继承了基类,但并不
9、是说派生类就可以访问基类的私有成员,基类无论怎样被继承,其私有成员对基类而言仍然保持私有性。 在派生类中声明的名字如果与基类中声明的名字相同,则派生类中的名字起支配作用。也就是说,若在派生类的成员函数中直接使用该名字的话,该名字是指在派生类中声明的名字。如果要使用基类中的名字,则应使用作用与运算符加以限定,即在该名字前加“基类名”。,16,假设类B以私有方式继承A,class B:private A /类B以私有继承的方式继承类A的成员 private: int t; public: void sett(int n,int m) set(n); t=m; /可直接访问从基类中私有继承的成员 i
10、nt gett() return t*gets(); /通过基类的成员函数间接访问基类的私有成员 ; main() B ob; ob.set(12); / /非法,不能通过类外对象访问从基类私有继承来的成员 ob.sett(5,7); coutob.gett()endl; return 0; ,17,如前所述,不论是公有派生还是私有派生,派生类都不能访问他的基类的私有成员,要想访问,只能通过调用基类成员函数的方式来实现,也就是使用基类提供的接口来访问。这对于频繁访问基类私有成员的派生类而言,很不方便。为此,C+提供了具有另一种访问特性的成员即保护(protected)成员。,18,class
11、A private: int s; protected: int r; /声明变量r为保护成员 public: int t; void setst(int n,int m) s=n; t=m int gets() return s; ; class B:protected A /类B以保护继承的方式继承类A的成员 private: int p; public: void setsrp(int n,int m,int l) setst(n,m); r=m; p=l; /可直接访问从基类中保护继承的成员 int getp() p=p+t*gets(); /通过基类的成员函数间接访问基类的私有成员
12、return p; ;,19,三、派生类的构造函数,1. 派生类构造函数和析构函数构建的原则: (1)基类的构造函数和析构函数不能被派生类继承。 (2)如果基类没有定义构造函数,派生类也可以不定义构造函数,全都采用缺省的构造函数,此时,派生类新增成员的初始化工作可用其他公有函数来完成。 (3)如果基类定义了带有形参表的构造函数,派生类就必须定义新的构造函数,提供一个将参数传递给基类构造函数的途径,以便保证在基类进行初始化时能获得必需的数据。 (4)如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责自己的间接基类的构造。 (5)派生类是否要定义析构函数与所属的基类无关,如果
13、派生类对象在撤销时需要做清理善后工作,就需要定义新的析构函数。,20,2 派生类构造函数的构建,(1)派生类的构造函数的定义格式如下: 派生类名:派生类构造函数名(参数表):基类构造函数名(参数表) /派生类新增成员的初始化语句 派生类的构造函数除初始化其自身定义的数据成员外,还必须对基类中的数据成员进行初始化,也就是说,派生类的构造函数要负责调用基类的构造函数。 (2)虽然派生类可以直接访问基类的数据成员,甚至在构造时初始化它们,但是一般不这么做,而是通过基类的接口(成员函数)去访问它们,初始化也是通过基类的构造函数。这样,避免了类与类之间的相互干扰。,21,3 派生类析构函数的构建,派生类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承 机制
链接地址:https://www.31doc.com/p-2502504.html