C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生

上传人:E**** 文档编号:89370890 上传时间:2019-05-24 格式:PPT 页数:28 大小:1.75MB
返回 下载 相关 举报
C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生_第1页
第1页 / 共28页
C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生_第2页
第2页 / 共28页
C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生_第3页
第3页 / 共28页
C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生_第4页
第4页 / 共28页
C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生》由会员分享,可在线阅读,更多相关《C++程序设计大学教程 教学课件 ppt 王春玲 第7章 继承和派生(28页珍藏版)》请在金锄头文库上搜索。

1、继承和派生,第7章,2,7.1 继承的概念,继承(Inheritance)就是在一个已存在的类的基础上建立一个新类,实质就是利用已有的数据类型定义出新的数据类型。 在继承关系中: 被继承的类称为基类(Base class)(或父类) 定义出来的新类称为派生类(Derived class)(子类),3,派生类不仅可以继承原来类的成员,还可以通过以下方式扩充新的成员: (1)增加新的数据成员 (2)增加新的成员函数 (3)重新定义已有成员函数 (4)改变现有成员的属性,4,多重继承,单继承:派生类只有一个直接基类。 多重继承:派生类同时有多个直接基类。,单继承,5,7.2 单继承,7.2.1 单继

2、承的定义方式 class 派生类名: 访问方式 基类名 派生类中的新成员 其中: (1)class是定义类的关键字;派生类名由用户自己命名。 (2)在冒号“:”后的内容告诉系统,这个派生类是从哪个基类派生的以及在派生时的继承方式是什么。 (3)继承方式即访问方式,可以为public、protected或private,如果省略,则默认为private方式。 (4)基类名必须是程序中已有的一个类的类名。 (5)大括号内的部分是派生类中新定义的成员或是对基类成员的改造。,6,【例7-1】 定义长方形类Rectangle,它的数据成员length和width分别表示长方形的长度和宽度,它的成员函数只

3、有set1,用于设置数据成员的值。以Rectangle作为基类来定义派生类Cuboid(长方体类),其中增加数据成员height、成员函数set2和show。,7,7.2.2 派生类的成员构成,派生新类经历了三个步骤: (1)吸收基类成员 派生类继承和吸收了基类的全部数据成员和除了构造函数、析构函数之外的全部成员函数。 (2)改造基类成员 一是基类成员的访问方式问题; 二是对基类数据成员或成员函数的覆盖。 (3)添加新成员 保证了派生类在功能上比基类有所发展。,8,7.2.3 继承方式对基类成员的访问属性控制,1. 公有继承(public继承方式) 基类中public和protected成员的

4、访问属性在派生类中不变; 而基类中的不可访问成员和private成员在派生类中不可访问。 注意:不可访问成员与私有成员的区别。,9,2. 私有继承(private继承方式) 基类中public和protected成员都以private成员出现在派生类中; 而基类中的不可访问成员和private成员在派生类中不可访问。 相当于中止了基类功能的继续派生!,10,3. 保护继承(protected继承方式) 基类中public和protected成员都以protected成员出现在派生类中; 而基类中的不可访问成员和private成员在派生类中不可访问。,11,类的继承方式对基类成员的访问属性控制,

5、12,【例7-2】验证公有继承方式下,基类和派生类的成员的访问特性。,13,私有继承方式,14,保护继承方式,15,7.2.4 派生类的构造函数,派生类的构造函数: 一方面负责调用基类的构造函数对基类成员进行初始化; 另一方面还要负责对基类的构造函数所需要的参数进行必要的设置。,16,派生类名:派生类构造函数名(总参数列表):基类构造函数名(参数列表) 派生类中新增数据成员初始化语句 【例7-3】设计一个点类Point,包含横、纵坐标两个数据成员,由它派生出圆类Circle,添加一个半径数据,并求其面积。测试基类的构造函数和派生类的构造函数的执行顺序。,17,18,19,【例7-4】定义一个描

6、述圆的类Circle和一个描述圆柱体的类Cylinder,并计算其相应的面积。 在C+中,处理同名函数时有以下3种基本方法: 根据函数参数的特征进行区分。如: max(int,int) max(float,float) 根据类对象进行区分。 cylinder.area() circle.area() 使用作用域运算符“:”进行区分,如: Ccircle:area(),20,7.2.5 有子对象的派生类的构造函数,派生类名:派生类构造函数名(总参数列表): 基类构造函数名(参数列表), 子对象名(参数列表), 派生类中新增数据成员初始化语句 此时,构造函数执行的一般次序为: 调用基类的构造函数。

7、 调用子对象的构造函数。当派生类中含有多个子对象时,各子对象的构造函数的调用顺序按照它们在类中说明的先后顺序进行。 执行派生类构造函数的函数体。,21,7.2.6 派生类的析构函数,析构函数的作用是在对象撤销之前,进行必要的清理工作。 当对象被删除时,系统会自动调用析构函数。 析构函数的调用顺序与构造函数的调用顺序正好相反: 先执行派生类自己的析构函数; 然后调用子对象的析构函数; 最后调用基类的析构函数。 【例7-5】 分析以下程序的执行结果。,22,7.3 多重继承,7.3.1 多重继承的定义方式 class 派生类名:访问方式 基类名1,访问方式 基类名2 ; 其中: (1)继承方式为p

8、ublic、protected或private,功能同单一继承。 (2)在冒号“:”后要列出派生类的所有基类及其继承方式,并用逗号做分隔符。,23,派生类名:派生类构造函数名(参数表):基类名1 (参数表1),基类名2(参数表2), 派生类中新增数据成员初始化语句 在多重继承下,系统首先执行各基类的构造函数,然后再执行派生类的构造函数; 处于同一层次的各基类构造函数的执行顺序与声明派生类时所指定的各基类顺序一致,而与派生类的构造函数定义中所调用的基类构造函数的顺序无关。 【例7-6】 测试在多重继承关系下析构函数的执行顺序。,24,7.3.2 多重继承的二义性,1. 多重继承的二义性 多重继承

9、下,可能会产生一个类是通过多条路径从一个给定的类中派生出来的情况。,通过派生类D3的对象访问类B的成员?,B,D1,D2,D3,25,同名成员的二义性。被继承的多个基类中具有同名成员,在派生类中对该同名成员的访问会产生二义性。 同一个基类被多次继承产生的二义性。被继承的多个基类有一个共同的基类,在派生类中访问这个共同基类的成员会产生二义性。,26,一是使用作用域运算符。 二是将直接基类的共同基类设置为虚基类。,2. 多重继承的二义性问题的解决方法,直接基类名:数据成员名 直接基类名:成员函数名(参数表),class 派生类名:virtual 访问方式 基类名 ;,27,7.3.3 虚基类及其派生类的构造函数,虚基类:虽然被一个派生类间接地多次继承,但派生类却只继承一份该基类的成员,这样就避免了在派生类中访问这些成员时产生二义性。 使用虚基类时,要特别注意派生类的构造函数。 对于普通基类,派生类的构造函数负责调用其直接基类的构造函数以初始化其直接基类的数据成员; 而对于虚基类的任何派生类,其构造函数不仅负责调用直接基类的构造函数,还需调用虚基类的构造函数。,28,【例7-7】按照如图7-8所示的类之间的关系,设计对应的类和相关的构造函数,并将类B声明为虚基类,测试虚基类的作用。,

展开阅读全文
相关资源
相关搜索

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

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