第四讲面向对象技术中继承性的实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四讲 面向对象技术 面向对象技术 继承性的实现
主讲:甘玲 主讲:
内容提要
• • • • • 继承的概念 派生类的定义格式 基类成员在派生类中的访问属性一览表 派生类的构造函数和析构函数 多继承
2011-10-25
第四讲 继承性的实现
2
一个问题
• 设计一个人员信息管理系统。某小型公司, 设计一个人员信息管理系统。某小型公司, 主要有三类人员:经理、兼职技术人员、 主要有三类人员:经理、兼职技术人员、 销售经理和兼职推销员。 销售经理和兼职推销员。要求存储这些人 员的姓名、编号、级别、当月薪水, 员的姓名、编号、级别、当月薪水,计算 月薪总额并显示全部信息。 月薪总额并显示全部信息。
2011-10-25
第四讲 继承性的实现
10
• 本问题涉及:继承、派生、派生类构造函 本问题涉及:继承、派生、 数和析构函数、多继承、虚基类,等等。 数和析构函数、多继承、虚基类,等等。 下面逐一说明。 下面逐一说明。
2011-10-25
第四讲 继承性的实现
11
继承的概念
• 类的继承就是根据一个类创建一个新类的过程。 类的继承就是根据一个类创建一个新类的过程。 • 新类自动具有已有类的所有成员,并可根据需 新类自动具有已有类的所有成员, 要添加更多的成员。 要添加更多的成员。 • 换个角度,从已有类产生新类的过程就是类的 换个角度, 派生。 派生。 • 通常将用来派生新类的类称为基类,又称为父 通常将用来派生新类的类称为基类 又称为父 基类, 而将派生出来的新类称为派生类 派生类, 类,而将派生出来的新类称为派生类,又称为 子类。 子类。
24
派生类构造函数的执行次序
• 首先,调用基类构造函数,调用顺序按照 首先,调用基类构造函数, 基类构造函数 它们被继承时声明的基类名顺序执行。 它们被继承时声明的基类名顺序执行。 • 其次,调用对象成员类构造函数,调用次 其次,调用对象成员类构造函数 对象成员类构造函数, 序按各个对象在派生类内声明的顺序。 序按各个对象在派生类内声明的顺序。 • 最后,执行派生类构造函数体中的内容。 最后,执行派生类构造函数体中的内容。 派生类构造函数体中的内容
2011-10-25
第四讲 继承性的实现
5
分析问题
• 根据上述需求,设计一个基类employee, 根据上述需求,设计一个基类employee, employee 然后派生出technician 兼职技术人员) technician( 然后派生出technician(兼职技术人员) 类和salesman 兼职推销员) salesman( 类和salesman(兼职推销员)类。由于销 售经理既是经理又是销售人员, 售经理既是经理又是销售人员,兼具两类 人员的特点, technician和 人员的特点,因此同时继承 technician和 salesman两个类。(多继承 两个类。(多继承) salesman两个类。(多继承)
2011-10-25
第四讲 继承性的实现
6
• 在基类中,除了定义构造函数和析构函数以外, 在基类中,除了定义构造函数和析构函数以外, 构造函数和析构函数以外 还应统一定义对各类人员信息都应有的操作, 还应统一定义对各类人员信息都应有的操作,这 样可以规范类族中各派生类的基本行为。 样可以规范类族中各派生类的基本行为。但是各 类人员的月薪计算方法不同, 类人员的月薪计算方法不同,不能在基类 employee中统一定义计算方法 中统一定义计算方法。 employee中统一定义计算方法。各类人员信息的 显示内容也不同,同样不能在基类employee employee中统 显示内容也不同,同样不能在基类employee中统 一定义显示方法。因此, 一定义显示方法。因此,在本例中可以使基类中 定义上述行为的函数体为空, 定义上述行为的函数体为空,然后在派生类中再 根据同名覆盖原则定义各自的同名函数实现具体 功能。 功能。
2011-10-25 第四讲 继承性的实现 19
保护继承的访问权限控制
• 当类的继承方式为保护继承时,在派生类中, 当类的继承方式为保护继承时,在派生类中, 继承的基类的公有成员和保护成员变为保护 成员,而对基类的私有成员不可访问。 成员,而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承以后作 为派生类的保护成员, 为派生类的保护成员,派生类的成员可以直 接访问它们, 接访问它们,而派生类的成员无法访问基类 的私有成员。在类外, 的私有成员。在类外,派生类的对象无法访 问基类的所有成员。 问基类的所有成员。
20111218第四讲继承性的实现22三种继承方式下派生类中基类成员的访问属性三种继承方式下派生类中基类成员的访问属性publicprivateprotected公有成员公有私有保护私有成员不可访问不可访问不可访问保护成员保护私有保护20111218第四讲继承性的实现23派生类的构造函数派生类的构造函数派生类构造函数的一般格式如下
第四讲 继承性的实现
23
• 示例派生类构造函数和析构函数的调用顺 序以及对基类数据的初始化.cpp P94例 .cpp( 序以及对基类数据的初始化.cpp(P94例47) • 示例继承方式下构造函数和析构函数的调 用顺序.cpp P95例 用顺序.cpp (P95例4-8)
2011-10-25
第四讲 继承性的实现
2011-10-25
第四讲 继承性的实现
3
• 人员编号基数为 1000,每输入一个人员信 1000, 息编号顺序加 1。 • 程序要对所有人员有提升级别的功能。本 程序要对所有人员有提升级别的功能。 例中为简单起见,所有人员的初始级别均 例中为简单起见, 然后进行升级,经理升为4 为1级,然后进行升级,经理升为4级,兼 职技术人员和销售经理升为3 职技术人员和销售经理升为3级,推销员仍 为 1 级。
2011-10-25
第四讲 继承性的实现
12
人类 基类 父类) (父类)
派生 继承
学生类 派生类 子类) (子类)
2011-10-25
第四讲 继承性的实现
13
派生类
• 派生类是特殊的基类,基类是派生类的抽象描 派生类是特殊的基类, 派生类继承了基类的所有特性, 述。派生类继承了基类的所有特性,但不等同 于基类,否则就没有派生的必要了。 于基类,否则就没有派生的必要了。 • 继承的作用就是体现特殊与一般的关系,寻找 继承的作用就是体现特殊与一般的关系, 有共性的事物间的差异,求其发展; 有共性的事物间的差异,求其发展;另一个作 用是代码重用,从基类派生子类, 用是代码重用,从基类派生子类,无需修改基 类的代码,就可以直接调用基类的成员, 类的代码,就可以直接调用基类的成员,而自 己的代码只需在派生类中实现即可。 己的代码只需在派生类中实现即可。
2011-10-25 第四讲 继承性的实现 20
• 示例派生和继承.cpp (P87例4-1) 示例派生和继承.cpp P87例 • 同名覆盖的原则:如果派生类有与基类 同名覆盖的原则:如果派生类有与基类 同名的成员, 同名的成员,则派生类对象直接访问的 是派生类同名成员;如果派生类对象要 是派生类同名成员;如果派生类对象要 访问继承下来的基类的同名成员, 访问继承下来的基类的同名成员,则需 加上基类名及其作用域运算符。 加上基类名及其作用域运算符。
2011-10-25
第四讲 继承性的实现
15
派生类的生成过程
• 分析派生新类的过程可知,派生类的生成 分析派生新类的过程可知, 经历了三个步骤: 经历了三个步骤:
– 吸收基类成员; 吸收基类成员; – 改造基类成员; 改造基类成员; – 添加派生类新成员。 添加派生类新成员。
2011-10-25
第四讲 继承性的实现
2011-10-25
第四讲 继承性的实现
17
公有继承的访问权限控制
• 类的继承方式为公有继承时,在派生类中,继承 类的继承方式为公有继承时,在派生类中, 的基类的公有成员和保护成员的访问属性不变, 的基类的公有成员和保护成员的访问属性不变, 而对基类的私有成员不可访问。 而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承后分别作为 派生类的公有成员和保护成员, 派生类的公有成员和保护成员,派生类的成员可 以直接访问它们, 以直接访问它们,而派生类的成员无法访问基类 的私有成员。在类外, 的私有成员。在类外,派生类的对象可以访问继 承下来的基类公有成员。 承下来的基类公有成员。
2011-10-25
第四讲 继承性的实现
7
类图设计
2011-10-25
第四讲 继承性的实现
8
2011-10-25
第四讲 继承性的实现
9
• 由于salesmanager类的两个基类,又有公 由于salesmanager类的两个基类, salesmanager类的两个基类 共基类employee 为了避免二义性, employee, 共基类employee,为了避免二义性,这里 employee设计为虚基类 设计为虚基类。 将employee设计为虚基类。
16
访问权限控制
• 不论哪种继承方式,派生类新定义成员均 不论哪种继承方式, 不能直接访问基类的私有成员, 不能直接访问基类的私有成员,只能通过 基类的公有成员函数或保护成员函数访问 基类的私有数据成员, 基类的私有数据成员,而基类的私有成员 函数根本就不会继承,更谈不上使用。 函数根本就不会继承,更谈不上使用。所 除非仅限于本类使用,否则, 以,除非仅限于本类使用,否则,一般不 将成员函数定义为私有成员。 将成员函数定义为私有成员。
2011-10-25
第四讲 继承性的实现
21
三种继承方式下派生类中基类成员的访问属性
public 公有成员 公有
private protected 私有 保护
私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护
20
派生类的构造函数
• 派生类构造函数的一般格式如下: 派生类构造函数的一般格式如下:
2011-10-25
第四讲 继承性的实现
4
• 月薪计算办法是:经理拿固定月薪8000元; 月薪计算办法是:经理拿固定月薪8000元 8000 兼职技术人员按每小时100元领取月薪; 100元领取月薪 兼职技术人员按每小时100元领取月薪;兼 职推销员的月薪按该推销员当月销售额的4 职推销员的月薪按该推销员当月销售额的4 提成; %提成;销售经理既拿固定月薪也领取销 售提成,固定月薪为5000 5000元 售提成,固定月薪为5000元,销售提成为 所管辖部门当月销售总额的5 所管辖部门当月销售总额的5‰ 。
2011-10-25
第四讲 继承性的实现
18
私有继承的访问权限控制
• 当类的继承方式为私有继承时,在派生类中,继 当类的继承方式为私有继承时,在派生类中, 承的基类的公有成员和保护成员变为私有成员, 承的基类的公有成员和保护成员变为私有成员, 而对基类的私有成员不可访问。 而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承以后作为派 生类的私有成员, 生类的私有成员,派生类的成员可以直接访问它 而派生类的成员无法访问基类的私有成员。 们,而派生类的成员无法访问基类的私有成员。 在类外,派生类的对象无法访问基类的所有成员。 在类外,派生类的对象无法访问基类的所有成员。 因此,私有继承之后, 因此,私有继承之后,基类的成员再也无法在以 后的派生类中发挥作用,出于这种原因, 后的派生类中发挥作用,出于这种原因,一般不 使用私有继承方式。 使用私有继承方式。
<派生类名>(<总参数表>):<基类名>(<参数表1>),<子对象名>(<参数表2>) 派生类名>(<总参数表>): 基类名>(<参数表1>), 子对象名>(<参数表2 >(<总参数表>) >(<参数表 >(<参数表 { 派生类数据成员的初始化> <派生类数据成员的初始化> };
2011-10-25
2011-10-25
第四讲 继承性的实现
14
派生类的定义
<派生类名>:<继承方式 <基类名 派生类名>:<继承方式> 基类名> class <派生类名>:<继承方式> <基类名> { <派生类新定义成员> 派生类新定义成员> }; • 其中,<继承方式>有三种:公有继承、私有继 其中, 继承方式>有三种:公有继承、 承和保护继承,分别用关键字public public、 承和保护继承,分别用关键字public、private 表示。 protected表示 缺省情况下为私有继承。 和protected表示。缺省情况下为私有继承。
主讲:甘玲 主讲:
内容提要
• • • • • 继承的概念 派生类的定义格式 基类成员在派生类中的访问属性一览表 派生类的构造函数和析构函数 多继承
2011-10-25
第四讲 继承性的实现
2
一个问题
• 设计一个人员信息管理系统。某小型公司, 设计一个人员信息管理系统。某小型公司, 主要有三类人员:经理、兼职技术人员、 主要有三类人员:经理、兼职技术人员、 销售经理和兼职推销员。 销售经理和兼职推销员。要求存储这些人 员的姓名、编号、级别、当月薪水, 员的姓名、编号、级别、当月薪水,计算 月薪总额并显示全部信息。 月薪总额并显示全部信息。
2011-10-25
第四讲 继承性的实现
10
• 本问题涉及:继承、派生、派生类构造函 本问题涉及:继承、派生、 数和析构函数、多继承、虚基类,等等。 数和析构函数、多继承、虚基类,等等。 下面逐一说明。 下面逐一说明。
2011-10-25
第四讲 继承性的实现
11
继承的概念
• 类的继承就是根据一个类创建一个新类的过程。 类的继承就是根据一个类创建一个新类的过程。 • 新类自动具有已有类的所有成员,并可根据需 新类自动具有已有类的所有成员, 要添加更多的成员。 要添加更多的成员。 • 换个角度,从已有类产生新类的过程就是类的 换个角度, 派生。 派生。 • 通常将用来派生新类的类称为基类,又称为父 通常将用来派生新类的类称为基类 又称为父 基类, 而将派生出来的新类称为派生类 派生类, 类,而将派生出来的新类称为派生类,又称为 子类。 子类。
24
派生类构造函数的执行次序
• 首先,调用基类构造函数,调用顺序按照 首先,调用基类构造函数, 基类构造函数 它们被继承时声明的基类名顺序执行。 它们被继承时声明的基类名顺序执行。 • 其次,调用对象成员类构造函数,调用次 其次,调用对象成员类构造函数 对象成员类构造函数, 序按各个对象在派生类内声明的顺序。 序按各个对象在派生类内声明的顺序。 • 最后,执行派生类构造函数体中的内容。 最后,执行派生类构造函数体中的内容。 派生类构造函数体中的内容
2011-10-25
第四讲 继承性的实现
5
分析问题
• 根据上述需求,设计一个基类employee, 根据上述需求,设计一个基类employee, employee 然后派生出technician 兼职技术人员) technician( 然后派生出technician(兼职技术人员) 类和salesman 兼职推销员) salesman( 类和salesman(兼职推销员)类。由于销 售经理既是经理又是销售人员, 售经理既是经理又是销售人员,兼具两类 人员的特点, technician和 人员的特点,因此同时继承 technician和 salesman两个类。(多继承 两个类。(多继承) salesman两个类。(多继承)
2011-10-25
第四讲 继承性的实现
6
• 在基类中,除了定义构造函数和析构函数以外, 在基类中,除了定义构造函数和析构函数以外, 构造函数和析构函数以外 还应统一定义对各类人员信息都应有的操作, 还应统一定义对各类人员信息都应有的操作,这 样可以规范类族中各派生类的基本行为。 样可以规范类族中各派生类的基本行为。但是各 类人员的月薪计算方法不同, 类人员的月薪计算方法不同,不能在基类 employee中统一定义计算方法 中统一定义计算方法。 employee中统一定义计算方法。各类人员信息的 显示内容也不同,同样不能在基类employee employee中统 显示内容也不同,同样不能在基类employee中统 一定义显示方法。因此, 一定义显示方法。因此,在本例中可以使基类中 定义上述行为的函数体为空, 定义上述行为的函数体为空,然后在派生类中再 根据同名覆盖原则定义各自的同名函数实现具体 功能。 功能。
2011-10-25 第四讲 继承性的实现 19
保护继承的访问权限控制
• 当类的继承方式为保护继承时,在派生类中, 当类的继承方式为保护继承时,在派生类中, 继承的基类的公有成员和保护成员变为保护 成员,而对基类的私有成员不可访问。 成员,而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承以后作 为派生类的保护成员, 为派生类的保护成员,派生类的成员可以直 接访问它们, 接访问它们,而派生类的成员无法访问基类 的私有成员。在类外, 的私有成员。在类外,派生类的对象无法访 问基类的所有成员。 问基类的所有成员。
20111218第四讲继承性的实现22三种继承方式下派生类中基类成员的访问属性三种继承方式下派生类中基类成员的访问属性publicprivateprotected公有成员公有私有保护私有成员不可访问不可访问不可访问保护成员保护私有保护20111218第四讲继承性的实现23派生类的构造函数派生类的构造函数派生类构造函数的一般格式如下
第四讲 继承性的实现
23
• 示例派生类构造函数和析构函数的调用顺 序以及对基类数据的初始化.cpp P94例 .cpp( 序以及对基类数据的初始化.cpp(P94例47) • 示例继承方式下构造函数和析构函数的调 用顺序.cpp P95例 用顺序.cpp (P95例4-8)
2011-10-25
第四讲 继承性的实现
2011-10-25
第四讲 继承性的实现
3
• 人员编号基数为 1000,每输入一个人员信 1000, 息编号顺序加 1。 • 程序要对所有人员有提升级别的功能。本 程序要对所有人员有提升级别的功能。 例中为简单起见,所有人员的初始级别均 例中为简单起见, 然后进行升级,经理升为4 为1级,然后进行升级,经理升为4级,兼 职技术人员和销售经理升为3 职技术人员和销售经理升为3级,推销员仍 为 1 级。
2011-10-25
第四讲 继承性的实现
12
人类 基类 父类) (父类)
派生 继承
学生类 派生类 子类) (子类)
2011-10-25
第四讲 继承性的实现
13
派生类
• 派生类是特殊的基类,基类是派生类的抽象描 派生类是特殊的基类, 派生类继承了基类的所有特性, 述。派生类继承了基类的所有特性,但不等同 于基类,否则就没有派生的必要了。 于基类,否则就没有派生的必要了。 • 继承的作用就是体现特殊与一般的关系,寻找 继承的作用就是体现特殊与一般的关系, 有共性的事物间的差异,求其发展; 有共性的事物间的差异,求其发展;另一个作 用是代码重用,从基类派生子类, 用是代码重用,从基类派生子类,无需修改基 类的代码,就可以直接调用基类的成员, 类的代码,就可以直接调用基类的成员,而自 己的代码只需在派生类中实现即可。 己的代码只需在派生类中实现即可。
2011-10-25 第四讲 继承性的实现 20
• 示例派生和继承.cpp (P87例4-1) 示例派生和继承.cpp P87例 • 同名覆盖的原则:如果派生类有与基类 同名覆盖的原则:如果派生类有与基类 同名的成员, 同名的成员,则派生类对象直接访问的 是派生类同名成员;如果派生类对象要 是派生类同名成员;如果派生类对象要 访问继承下来的基类的同名成员, 访问继承下来的基类的同名成员,则需 加上基类名及其作用域运算符。 加上基类名及其作用域运算符。
2011-10-25
第四讲 继承性的实现
15
派生类的生成过程
• 分析派生新类的过程可知,派生类的生成 分析派生新类的过程可知, 经历了三个步骤: 经历了三个步骤:
– 吸收基类成员; 吸收基类成员; – 改造基类成员; 改造基类成员; – 添加派生类新成员。 添加派生类新成员。
2011-10-25
第四讲 继承性的实现
2011-10-25
第四讲 继承性的实现
17
公有继承的访问权限控制
• 类的继承方式为公有继承时,在派生类中,继承 类的继承方式为公有继承时,在派生类中, 的基类的公有成员和保护成员的访问属性不变, 的基类的公有成员和保护成员的访问属性不变, 而对基类的私有成员不可访问。 而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承后分别作为 派生类的公有成员和保护成员, 派生类的公有成员和保护成员,派生类的成员可 以直接访问它们, 以直接访问它们,而派生类的成员无法访问基类 的私有成员。在类外, 的私有成员。在类外,派生类的对象可以访问继 承下来的基类公有成员。 承下来的基类公有成员。
2011-10-25
第四讲 继承性的实现
7
类图设计
2011-10-25
第四讲 继承性的实现
8
2011-10-25
第四讲 继承性的实现
9
• 由于salesmanager类的两个基类,又有公 由于salesmanager类的两个基类, salesmanager类的两个基类 共基类employee 为了避免二义性, employee, 共基类employee,为了避免二义性,这里 employee设计为虚基类 设计为虚基类。 将employee设计为虚基类。
16
访问权限控制
• 不论哪种继承方式,派生类新定义成员均 不论哪种继承方式, 不能直接访问基类的私有成员, 不能直接访问基类的私有成员,只能通过 基类的公有成员函数或保护成员函数访问 基类的私有数据成员, 基类的私有数据成员,而基类的私有成员 函数根本就不会继承,更谈不上使用。 函数根本就不会继承,更谈不上使用。所 除非仅限于本类使用,否则, 以,除非仅限于本类使用,否则,一般不 将成员函数定义为私有成员。 将成员函数定义为私有成员。
2011-10-25
第四讲 继承性的实现
21
三种继承方式下派生类中基类成员的访问属性
public 公有成员 公有
private protected 私有 保护
私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护
20
派生类的构造函数
• 派生类构造函数的一般格式如下: 派生类构造函数的一般格式如下:
2011-10-25
第四讲 继承性的实现
4
• 月薪计算办法是:经理拿固定月薪8000元; 月薪计算办法是:经理拿固定月薪8000元 8000 兼职技术人员按每小时100元领取月薪; 100元领取月薪 兼职技术人员按每小时100元领取月薪;兼 职推销员的月薪按该推销员当月销售额的4 职推销员的月薪按该推销员当月销售额的4 提成; %提成;销售经理既拿固定月薪也领取销 售提成,固定月薪为5000 5000元 售提成,固定月薪为5000元,销售提成为 所管辖部门当月销售总额的5 所管辖部门当月销售总额的5‰ 。
2011-10-25
第四讲 继承性的实现
18
私有继承的访问权限控制
• 当类的继承方式为私有继承时,在派生类中,继 当类的继承方式为私有继承时,在派生类中, 承的基类的公有成员和保护成员变为私有成员, 承的基类的公有成员和保护成员变为私有成员, 而对基类的私有成员不可访问。 而对基类的私有成员不可访问。 • 即基类的公有成员和保护成员被继承以后作为派 生类的私有成员, 生类的私有成员,派生类的成员可以直接访问它 而派生类的成员无法访问基类的私有成员。 们,而派生类的成员无法访问基类的私有成员。 在类外,派生类的对象无法访问基类的所有成员。 在类外,派生类的对象无法访问基类的所有成员。 因此,私有继承之后, 因此,私有继承之后,基类的成员再也无法在以 后的派生类中发挥作用,出于这种原因, 后的派生类中发挥作用,出于这种原因,一般不 使用私有继承方式。 使用私有继承方式。
<派生类名>(<总参数表>):<基类名>(<参数表1>),<子对象名>(<参数表2>) 派生类名>(<总参数表>): 基类名>(<参数表1>), 子对象名>(<参数表2 >(<总参数表>) >(<参数表 >(<参数表 { 派生类数据成员的初始化> <派生类数据成员的初始化> };
2011-10-25
2011-10-25
第四讲 继承性的实现
14
派生类的定义
<派生类名>:<继承方式 <基类名 派生类名>:<继承方式> 基类名> class <派生类名>:<继承方式> <基类名> { <派生类新定义成员> 派生类新定义成员> }; • 其中,<继承方式>有三种:公有继承、私有继 其中, 继承方式>有三种:公有继承、 承和保护继承,分别用关键字public public、 承和保护继承,分别用关键字public、private 表示。 protected表示 缺省情况下为私有继承。 和protected表示。缺省情况下为私有继承。