第五部分继承与类的派生教学课件讲课教案

上传人:yuzo****123 文档编号:137882838 上传时间:2020-07-12 格式:PPT 页数:118 大小:693.50KB
返回 下载 相关 举报
第五部分继承与类的派生教学课件讲课教案_第1页
第1页 / 共118页
第五部分继承与类的派生教学课件讲课教案_第2页
第2页 / 共118页
第五部分继承与类的派生教学课件讲课教案_第3页
第3页 / 共118页
第五部分继承与类的派生教学课件讲课教案_第4页
第4页 / 共118页
第五部分继承与类的派生教学课件讲课教案_第5页
第5页 / 共118页
点击查看更多>>
资源描述

《第五部分继承与类的派生教学课件讲课教案》由会员分享,可在线阅读,更多相关《第五部分继承与类的派生教学课件讲课教案(118页珍藏版)》请在金锄头文库上搜索。

1、第五章 继承与类的派生,根据软件需求从软件所要模拟的现实世界中抽象出 组成软件系统的对象类是面向对象程序设计的基础。 面向对象的封装性使这些对象类的属性和行为细节得 到了合理的保护和隐藏,并为类对象之间的通讯(方 法调用)提供了安全方便的接口。 在封装性的基础上,面向对象的继承性允许一个对 象类包含另一个或几个对象类的属性和行为,并使它 们成为自己的属性和行为,充分地反映了现实世界中 对象类之间的层次结构,为程序的代码重用提供了方 便、有效的实现机制。,在面向对象程序设计中,借助继承性的实现方法, 允许在既有类的基础上定义新类。被定义的新类可以 从一个或多个既有类中继承属性和行为,并允许重新

2、定义这些既有类中原有的属性和行为,还允许为新类 增加新的属性和行为,从而形成了类的建造层次。 既有类被称为基类或父类 新类被称为派生类、导出类或子类,本章要点 1 派生类的概念 2 派生类的定义方法 3 派生类成员的访问属性 4 派生类的构造函数和析构函数 5 对派生类成员访问属性的进一步讨论 6 多继承 7 继承在软件开发的重要意义,例如: 简单的汽车分类图,汽车,5.1.2 使用继承的必要性 试想如果组成一个系统的对象类均为互不包含的独 立对象类,则将不可避免出现对象属性和行为的重复 冗余,并且这种无层次关系的对象类既不符合现实世 界的对象关系,也使对象类的定义、创建、使用和维 护复杂化。

3、 继承为代码重用和建立类定义的层次结构提供方便 有效的手段。 例如在一个公司的管理软件设计中需要定义一个客 户类 Customer 和雇员类 Employee:,class Customer private: char name15;/ 姓名 int age;/ 年龄 char sex8;/ 性别 double income;/ 收入 public: void print();/ 显示输出状态 ;,class Employment private: char name15;/ 姓名 int age;/ 年龄 char sex8;/ 性别 char department20;/ 部门 doubl

4、e salary;/ 工资 public: void print();/ 显示输出状态 ;,比较两个类的定义,不难发现,两个类的数据成员 和成员函数有许多相同之处。显然,如此定义两个 类,造成的代码重复是不可避免的。 如果将 Customer 和 Employee 类定义中的相同成员 抽取出来,定义一个新类 Person: class Person private: char name15;/ 姓名 int age;/ 年龄 char sex8;/ 性别 public: void print();/ 显示输出状态 ;,Customer 和 Employee 都定义为 Person 的派生类,

5、那些在 Person 中已经定义的共同数据成员在 Customer 和 Employee 中就不需要再定义了,只需要在各自的定 义中增加自己的独有数据成员;而成员函数 print 也只 需要在 Person 所定义的行为操作基础上重新定义自己 的行为操作。 class Customer : public Person private: double income;/ 收入 public: void print();/ 显示输出状态 ;,class Employee : public Person private: char department20;/ 部门 double salary;/ 工

6、资 public: void print();/ 显示输出状态 ; 显然通过继承可以从基类 Person 派生出一组具有层 次结构的新类,构成一个公司管理系统的主要对象类 型。例如:,使用继承机制和方法设计和建造类定义的层次结构 对于建立一个面向对象的软件系统是不可缺少的。返回,Person,5.2 派生类的定义方法 定义派生类的一般形式: class 派生类名 : 派生方式 基类名 派生类的新增加成员和基类成员的新定义 ; 例如:基类 Person 和派生类的定义 class Person private: char name15;/ 姓名 int age;/ 年龄 char sex8;/

7、性别 public: void print();/ 显示输出状态 ;,class Customer : public Person private: double income;/ 新增加的数据成员“收入” public: void print();/ 重新定义基类的“显示输出状态” ; 从形式上比较,派生类定义与非派生类定义的差别 仅在于定义首行中由 “:” 引出的派生表达式。其中: 派生方式:指明派生类继承基类成员的方式,方式 的种类有 public、private 和 protected。如果不指明方式名,则缺省指定派生方式为 private。 基类名:指明派生类所继承的类。,在 Jav

8、a 中类的派生又被称为类的扩展,这种扩展相 当于 C+ 中的公有(public)派生,其一般形式如下: class 派生类名 :extends 基类名 派生类的新增加成员和基类成员的新定义 ,5.2.1 派生类的构成 派生类的构成可以有下图示意:,派生类名,例如整数链表类 list 的定义: class list/ 链表类名超前声明 class node / 结点类定义 int val; node *next; public: friend class list; ;,class list / 整数链表类定义 node *elems/ 链表头指针 public: list(); list();

9、 bool insert(int);/ 在表头插入一个结点 bool deletes(int);/ 从表中删除一个结点 bool contains(int);/ 在表中查找一个结点 ;,一个链表结构的整数集合可以看成是不含重复元素 的特殊整数链表,因此整数集合类可以从整数链表类 派生。整数集合类在继承了整数链表类的所有成员的 基础上,需要新增加一个能指示集合中元素个数的数 据成员,同时还需要重新定义整数链表类的插入操作 insert,禁止重复元素被插入。 class set : public list int card;/ 集合中的元素个数 public: bool insert(int);/

10、 重新定义插入函数 ;返回,5.3 派生类成员的访问属性 类成员的访问属性是指类成员的被访问权限,这种 权限随着作用域的变化而变化的,派生类成员的访问 属性也分为类内访问属性和类外访问属性两种情况。 1 类内访问属性 由于派生类的成员分为继承的基类成员和自身的新 增成员两种,这两种成员的类内访问属性是有所区 别的。 基类成员的访问属性 封装性所限定的类成员类外访问权限确定了基类 成员在派生类定义中被访问的限定原则:, 私有成员:不允许被访问,与派生类从基类 的继承方式无关。 公有成员:允许被访问,与派生类从基类的 继承方式无关。 新增成员的访问属性 所有的新增成员均允许被访问,与新增成员被设

11、定的访问属性(公有或私有)无关。 2 类外访问属性 类成员的类外访问是指在类对象定义域外访问对象 的类成员。因此,派生类成员在类定义中声明的访 问属性确定了派生类成员的类外访问属性:, 基类成员的访问属性 私有成员:不允许被访问,与派生类从基类 的继承方式无关。 公有成员:依据继承方式的不同,在基类中 被设定的公有属性会发生不同的变化。 私有继承:基类的公有成员变为派生类的 私有成员,因此在类外不允许被访问。 公有继承:基类的公有成员在派生类中仍 保持公有属性,因此在类外允许被访问。 新增加成员的访问属性 类成员在类定义中被声明的访问属性确定了类成 员的类外访问属性。,类外,例5-1 包含了两

12、个类:由 C+ 标准模板库提供的 string 类具有丰富的字符串操作功能。edit_string 类是 从 string 类派生的,它在继承 string 类功能的基 础上增加了数据成员 光标和实现在光标处 的进行插入、替换、删除等文本编辑功能。 注意,派生类的成员名支配基类的成员名。 下面的类图描述了 string 和 edit_string 之间的派生层次 结构。,返回,5.4 派生类的构造函数和析构函数 5.4.1 派生类的构造函数 与一般非派生类相同,系统会为派生类定义一个缺 省(无参数、无显式初始化表、无数据成员初始化代 码)构造函数用于完成派生类对象创建时的内存分配 操作。但如果

13、在派生类对象创建时需要实现以下两种 操作或其中之一,就无法使用缺省构造函数完成。 派生类对象的直接基类部分创建需要传递参数。 派生类对象的新数据成员需要通过参数传递初值。 为了满足上述对象创建操作的需要,就必须显式定义 派生类构造函数。,派生类构造函数声明和定义的一般形式: 注意: 构造函数名后面的参数表列中包含了初始化表中创 建对象的基类部分、新增数据成员和在函数体中为 新数据成员赋初始值所需要的全部参数。,构造函数名(参数表列);,类名:构造函数名(参数表列),: 基类构造函数名(参数子表列), 新数据成员名1(参数子表列), 新数据成员名n(参数子表列), 其他初始化代码 , 初始化表中

14、创建对象的基类部分的表达式必须使用 基类构造函数名调用基类构造函数,而创建数据成 员表达式必须使用数据成员名调用数据成员类的构 造函数。 派生类构造函数的执行顺序:,基类构造函数,对象成员1 类构造函数,派生类构造 函数定义体,对象成员n 类构造函数,5.4.2 派生类的析构函数 与一般非派生类相同,系统会为派生类定义一个缺 省(无数据成员的清理代码)析构函数用于完成派生 类对象撤消时的内存回收操作。但如果在派生类对象 撤消时需要对某些新增数据成员进行内存回收之前的 清理操作(例如,指针数据成员所指向的动态内存的 回收),就无法使用缺省析构函数完成。为了满足上 述对象数据成员清理操作的需要,就

15、必须显式定义派 生类构造函数。,析构函数的执行顺序:,派生类析构 函数定义体,对象成员n 类析构函数,基类析构函数,对象成员1 类析构函数,5.4.3 派生类应用的实例 例5-2 中定义了一个人员类 person,并以 person 为基类 派生定义了学生类 student 和教师类 teacher。另 外在学生类 student 中还包含了一个 teacher 类对 象作为描述学生班主任的数据成员。三个类都分 别定义两个构造函数(其中一个有参数表列,另 一个无参数表列)和一个析构函数。通过不同形 式的 student 类对象和 teacher 类对象定义表达式 所导致的相应类的不同构造函数的

16、调用,验证派 生类对象创建和撤消中,基类构造函数、数据成 员类构造函数和派生类构造函数的调用顺序。,几点讨论: 1 如果派生类构造函数定义中无显式初始化表,则意 味着派生类对象的基类部分创建时,调用基类构造 函数无须参数;新增数据成员创建时,调用相应数 据类构造函数也无须参数。因此,如果基类和相应 的数据类没有定义无参数或有缺省参数值的构造函 数,将会导致编译错误。由此可见,一般情况在类 的定义中保留一个无须传递参数的构造函数是十分 必要的,除非需要禁止无参数创建类的对象。,无显式初始化表的派生类构造函数的一般形式: 系统的缺省构造函数是这种形式的一个特例,即无 参数,无显式初始化表和空定义体的类构造函数。,类名:构造函数名(参数表列) 新增数据成员赋初始值代码 ,类名:构造函数名() ,2 一般情况下,类数据成员的赋初始值操作均可以在 数据成员创建(分配内存)的同时进行,因此可以 通过初始化表同时完成数据成员的创建和赋初始值 操作。在这种情况

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

最新文档


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

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