C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承

上传人:w****i 文档编号:94379867 上传时间:2019-08-06 格式:PPT 页数:41 大小:115.50KB
返回 下载 相关 举报
C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承_第1页
第1页 / 共41页
C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承_第2页
第2页 / 共41页
C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承_第3页
第3页 / 共41页
C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承_第4页
第4页 / 共41页
C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承》由会员分享,可在线阅读,更多相关《C++语言程序设计 教学课件 ppt 作者 尹季昆 主编第三章 派生类与继承(41页珍藏版)》请在金锄头文库上搜索。

1、第3章 派生类与继承, 知识点 派生类的概念 派生类的构造函数和析构函数 多重继承 难点 派生类的构造函数和析构函数 多重继承 要求 掌握: 派生类的定义格式 基类与派生类的关系 派生类的构造函数和析构函数 了解: 多重继承,3.1 派生类的概念,在C+语言中,继承就是从已有的类“派生”出新的类,即继承就是一个新建的类拥有全部被继承类的数据成员和成员函数。这样,新产生的继承类不仅有自己特有的数据成员和成员函数,而且有继承类的全部数据成员和成员函数。C+语言中把产生新类的被继承类称作基类(或父类),把由基类通过继承方式产生的新类称作派生类(或子类)。 派生类继承了基类的成员函数,它本身也可以定义

2、其他一些成员函数。在派生类中,可以像引用派生类自身的成员一样引用基类成员,除非对基类的某个成员进行了重新定义。在产生多义的情况下,可以通过作用域符号“:”(基类名:成员函数名)明确指定引用的成员属于哪个基类。,3.1.1 派生类的定义格式,派生类一般的定义格式如下: class: ; 其中,是新定义的一个类的名字,它是从中派生出来的,并且按指定的派生。有以下三种,我们在后面详细介绍: public 表示公有基类。 private 表示私有基类(默认的继承方式)。 protected 表示保护基类。,例如,以下代码段从类A派生出类B,如图3.1所示。 class A /类的成员 class B:

3、public A /类B新添加的成员 说明: 图3.1 (1)程序书写的顺序,基类定义在先,派生类定义在后,由基类衍生出派生类。 (2)派生类定义体延续了基类的基本特征,并增添了体现派生类独有属性特征的数据成员和成员函数。 (3)有三种派生方式,公有派生public、保护派生protected、私有派生private(默认)。,下面我们构造一个简单的例子来说明派生类的定义方法。 Enum Sex male,female; /性别枚举类型 Enum Color White,Black,Yellow; /肤色枚举类型 class Person float height; /身高 int age;

4、/年龄 Sex sex; /性别 Color color_of_skin; /肤色 public: float GetHeight( ) return height; void SetHeight(float h) height=h; int GetAge( ) return age; void SetAge(int a) age=a; Sex GetSex( ) return sex; void SetSex(Sex s) sex=s; Color GetColor( ) return color_of_skin; void SetColor(Color c) color_of_skin=c

5、; ;,class BlackPerson:Person public: BlackPerson( ) SetColor(Black); ; 上面的程序定义了一个Person类,然后以Person为基类,并从中派生出了一个BlackPerson类,它与Person类具有相同的数据成员,但在该类对象构造时即将color_of_skin置为Black。,3.1.2 基类与派生类的关系,在C+语言中,基类的公有成员缺省情况下在派生类中是私有的,而私有成员在派生类的成员函数中是不能被访问的。 在上面的基类与派生类的例子中,派生类BlackPerson类对基类Person的特征作了修改,将color_o

6、f_skin的值置为 Black,BlackPerson类对象的外部不能直接访问SetColor函数成员,因此BlackPerson类对象的color_of_skin被构造函数调用SetColor函数置为Black后不能修改,这符合对BlackPerson类的要求,即肤色固定为黑。 但是,上面的例子中有这样一个问题,就是Person类中其它几个公有的函数成员现在也变成私有的了,该类对象的外部不能直接访问,而我们希望这几个函数成员可以在对象的外部直接访问,要实现这一点,可以在派生类定义中显式声明一下:,class BlackPerson: Person public: BlackPerson(

7、) SetColor(Black); Person: GetHeight; Person: SetHeight; Person: GetAge; Person: SetAge; Person: GetSex; Person: SetSex; Person: GetColor; ; 这样就可以在BlackPerson对象的外部来调用GetHeight等函数了.,如果基类中的所有公有数据成员和函数成员在派生类中都要求是公有的,可以不必一一声明,而是在派生类中使用基类存取指明符来声明: class BlackPerson: public Person public: BlackPerson( ) S

8、etColor(Black); ; 这里在基类名前加上了指明符public。 public指明符规定派生类按下述方式继承其基类成员的存取属性: 基类的public成员为派生类的public成员;基类的 private成员仍保持private。 基类存取指明符除public外,还可以为private和protected。如果使用了private指明符,则派生类按如下的方式继承其基类成员的存取属性: 基类的public成员为派生类的private成员;基类的 private成员仍保持private。 不管使用何种指明符,基类中的private成员在派生类中都是不可见的,即该派生类的函数成员不能直接

9、访问基类中的私有成员。 对于任何一个派生类,都有一个从派生类到其任何公有基类的隐含转换,即可以将一个派生类对象看成是一个基类对象。,例3-1 #include class X int a,b; public: X(int x,int y) a = x,b=y; void print( ) couta,bn; ; class Y: public X int c; public: Y(int x,int y,int z):X(x,y) c=z; ;,void main( ) Y y(10,10,10); X *x= 如果上面的程序在派生时未使用基类的指明符public,则不允许将派生类对象看成是基

10、类对象,因为此时基类的公有成员在派生类中是私有的,将其转换为基类对象则可以对这部分成员进行访问。,3.2 派生类的构造函数和析构函数,我们看到,派生类继承了基类的成员,实现了原代码的重用,这只是一部分,但现实中我们常常需要扩充基类代码的功能,即代码的扩充才是最重要的,只有通过添加新的成员,加入新的功能,类的派生才有实际意义。但是基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就必须由程序员针对实际需要加入新的构造函数。与此同时,对所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完成,我们必须在派生类中对基类的构造函数所需要的参数进行设置。同样,对派生

11、类对象的扫尾、清理工作也需要加入新的析构函数。,3.2.1 构造函数,构造函数和析构函数属于类中的成员函数。构造函数与所在的类有相同的名字,并且不带任何返回类型,也不需要返回任何值,函数的参数表和函数体由用户根据需要编写,是否为一个类建立重载的多个构造函数,也由用户根据使用类的需要而定。建立构造函数的作用是为类对象中的数据成员赋初值。有时还要为其中的指针数据成员动态分配所指向的存储空间。构造函数将由建立所属类的对象时自动调用,完成给对象赋初值的任务,而不允许像其他成员函数那样由用户直接调用。由于构造函数时载建立对象时自动调用的,而建立对象都是在类外进行的,所以必须把每个构造函数定义为类的公用成

12、员。 构造函数不能够被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时,除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。,派生类构造函数的一般语法规则为: :():(), , (),(), , () ; 这里,派生类的构造函数名与类名相同。在构造函数的参数表中,给出了初始化基类数据、新增对象数据及新增一般成员数据所需要的全部参数。在参数表之后,列出需要使用参数进行初始化的基类名和子对象名及各自的参数表,各项之间使用逗号分隔。这里基类名、子对象

13、名之间的次序无关紧要,它们各自出现的顺序可以是任意的。在生成派生类对象时,系统首先会使用这里列出的参数,来调用基类和子对象的构造函数。,派生类构造函数执行的一般次序如下: 调用基类构造函数,调用顺序按照它们被继承时说明的顺序(从左到右)。 调用子对象的构造函数,调用顺序按照它们正在类中说明的顺序。 派生类构造函数体中的内容。 其中,如果派生类新增成员中有某类的子对象,第步的调用才会执行,否则就直接跳转到第步,执行派生类构造函数。基类的构造函数调用顺序是按照说明派生时基类的排列顺序来进行,而子对象构造函数的调用顺序则是按照对象在派生中说明语句出现的先后顺序来进行。注意,这和派生类构造函数中列出的

14、名称顺序毫无关系。,例3-2 给出下列程序的输出结果: #include class A public: A( ) cout“A Constructorl“endl; A(int i) x1=i; cout“A Constructor2“endl; ; void dispa( ) cout“x1=“x1endl; private: int x1; ; class B:public A public: B( ) cout“B Constructorl“endl; B(int i):A(i+10) x2=i; cout“B Constructor2“endl; ; void dispb( ) di

15、spa( ); cout“x2=“x2endl; private: int x2; ;,void main( ) B b(2); b.dispb( ); 本程序中,类B是类A的派生类,它的构造函数B的冒号后面是成员初始化列表,如果该表中有多项,它们之间用逗号分隔。该成员初始化列表的顺序是:先是基类A构造函数;再是派生类B中子对象类的构造函数;最后是派生类B 的构造函数。所以本程序的执行结果如下: A Constrctor2 B Constrctor2 x1=12 x2=2,在实际中,使用派生类构造函数时应该注意如下两个问题: 派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有定义构造函数。当然,基类中没有定义构造函数,派生类根本不必负责调用基类构造函数。 当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。在某种情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。,例3-3 给出以下程序的执行结果: #include class A /定义基类A int a; public: A(int i) a=i; cout“A Constructor“endl; ; void disp( ) cout“a=“aendl;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号