派生类的构造函数与析构函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本 章 内 容
2020/1/2
第三章 继承
1 类的继承与派生
2 继承方式
3
派生类的构造函数与析构函数
4
虚基类
5
聚合类
6
继承应用实例
1
3.1 类的继承与派生
3.1.1 继承与派生实例 继承是软件重用的一种形式。继承是将自然界
中存在的普遍和特殊关系用程序设计的方式进 行分类描述; 在设计新类时,允许重用某个原有类的所有特 征,并在此基础上添加新类的新特征。 被重用的原有类称为基类base class而新创建 的类称为派生类derived class。
9 2020/1/2
3.2 继承方式
基类Base
派生类Derv :public Base
private protected public
private protected public
Derv objD
2020/1/2
图3.3 公有继承中的访问控10 制
Base objB
3.2 继承方式
例3.1 一个公有继承的例子: sclass3_1.h sclass3_1.cpp smain3_1.cpp 基类A的所有成员在派生类中的访问控制权限都
3.2 继承方式
3.2.3保护继承: protected访问权限:
设计基类时,在隐藏成员的同时还要允许派生 类的成员能访问到,这时protected 就比 private更合适;
例3.3 保护权限举例:
sclass3_3.h smain3_3.cpp
14 2020/1/2
3.2 继承方式
使用protected修饰类成员存在的隐患,它破坏 了封装;
计算实际发放工资 ……
3
3.1 类的继承与派生
针对该公司的情况,先设计: 一个一般员工类CCompanyStaff,代表员工的共 性; 让三个新类分别继承一般员工类CCompanyStaff, 然后根据各自的差异性,新类可以对继承来的内容 进行改造。
4 2020/1/2
3.1 类的继承与派生
protected继承; 保护继承下基类各成员的访问权限(除private
外)都以protected权限出现; 比较私有继承和保护继承,可以看出在直接派生
类中两者的效果实际上都相同,但如果再继续派 生下去就会出现区别;
15 2020/1/2
3.2 继承方式
假设有A <-B <- C这样一个继承顺序如果B私有 继承A后又派生出C那么C就无法再间接继承A的 成员对A功能的继承在B那儿就终止了;
保持不变。
11 2020/1/2
3.2 继承方式
3.2.2私有继承: 基类各成员无论是何种访问权限在派生类中一律 以private的身份出现,连派生类的对象也无法访问, 只有派生类的函数能在类内访问它们。 若要私有继承来的某些基类的成员函数在派生类 中也能对外可见,需在派生类中对其成员公有化。 • using CAnimal:: SetWeight; // 在派生类中将 基类的成员函数SetWeight( )公有化 • using CAnimal:: GetWeight; // 在派生类中将 基类的成员函数GetWeight( )公有化 例3.2 私有继承中的公有化: sclass3_2.h smain3_2.cpp
3.1.2 派生类的定义 从已有类产生新类的过程就是类的派生。 定义语法如下:
class <派生类名><继承方式>:<基类名1>, <继承方式>:<基类名2>… {
<派生类成员的定义>; }
5 2020/1/2
3.1 类的继承与派生
继承方式分为三种关键字: public private protected;
单继承(只有一个基类名)和多继承; 该公司情况类代码:
企业员工类 相关派生类 P79
经理、销售人员、行政人员这三个派生类在声明语句 中分别指定了它们的基类CCompanyStaff, 以及它 们的继承方式-public;
CSaleManager类,同时继承经理类Cmanager和销售 人员类Csaleman;
而如果B保护继承A后又派生出C那么A中的公有 和保护成员在B中都是保护成员因此A的功能可以 被C间接继承;
数析构函数之外的全部成员函数,但是派生类能否 访问这些成员还要受继承方式的约束;
8 2020/1/2
3.2 继承方式
3.2.1 公有继承 类的继承方式有public、private和protected三
种,其中private是缺省的继承方式; 公有继承:
基类各成员的访问权限如果是public或 protected则在派生类中保持不变而基类中的 private成员对派生类不可见,如图:
12 2020/1/2
3.2 继承方式
私有继承后的基类成员成为了派生类的私有成员, 实际上相当于终止了基类功能的继续派生。
• class <派生类名> : private <基类名> •{ • public: • using <基类名>:: <基类函数名>; // 公有化 • …… • };
13 2020/1/2
6 2020/1/2
3.1 类的继承与派生
3.1.3继承的级别 增加行政主管一职,员工关系图如下:
企业员工
经理
百度文库
销售员
行政人员
2020/1/2
类图
行政主管
7
3.1 类的继承与派生
用C++语言描述三个类的前向引用声明 ,形成了一 个“类家族”:
class CCompanyStaff; //基类员工 //派生类行政人员继承员工 class CAdminStaff : public CCompanyStaff ; //派生类行政主管继承行政人员 class CForeAdmin : public CAdminStaff; 基类不受派生类变化的影响; 派生类继承了基类的全部数据成员和除了构造函
派生类不会影响到原有类的结构。
2 2020/1/2
实例:某一小型公司的实例
企业员工
工作编号 姓名 ……
显示企业员工信息 计算实际发放工资 ……
行政人员 (与企业员工类相 同) 计算实际发放工资 ……
2020/1/2
经理
公司总销售额 提成比例(其余同 企业员工类)
计算实际发放工资 ……
销售人员
个人销售额 提成比例(其余同 企业员工类)
2020/1/2
第三章 继承
1 类的继承与派生
2 继承方式
3
派生类的构造函数与析构函数
4
虚基类
5
聚合类
6
继承应用实例
1
3.1 类的继承与派生
3.1.1 继承与派生实例 继承是软件重用的一种形式。继承是将自然界
中存在的普遍和特殊关系用程序设计的方式进 行分类描述; 在设计新类时,允许重用某个原有类的所有特 征,并在此基础上添加新类的新特征。 被重用的原有类称为基类base class而新创建 的类称为派生类derived class。
9 2020/1/2
3.2 继承方式
基类Base
派生类Derv :public Base
private protected public
private protected public
Derv objD
2020/1/2
图3.3 公有继承中的访问控10 制
Base objB
3.2 继承方式
例3.1 一个公有继承的例子: sclass3_1.h sclass3_1.cpp smain3_1.cpp 基类A的所有成员在派生类中的访问控制权限都
3.2 继承方式
3.2.3保护继承: protected访问权限:
设计基类时,在隐藏成员的同时还要允许派生 类的成员能访问到,这时protected 就比 private更合适;
例3.3 保护权限举例:
sclass3_3.h smain3_3.cpp
14 2020/1/2
3.2 继承方式
使用protected修饰类成员存在的隐患,它破坏 了封装;
计算实际发放工资 ……
3
3.1 类的继承与派生
针对该公司的情况,先设计: 一个一般员工类CCompanyStaff,代表员工的共 性; 让三个新类分别继承一般员工类CCompanyStaff, 然后根据各自的差异性,新类可以对继承来的内容 进行改造。
4 2020/1/2
3.1 类的继承与派生
protected继承; 保护继承下基类各成员的访问权限(除private
外)都以protected权限出现; 比较私有继承和保护继承,可以看出在直接派生
类中两者的效果实际上都相同,但如果再继续派 生下去就会出现区别;
15 2020/1/2
3.2 继承方式
假设有A <-B <- C这样一个继承顺序如果B私有 继承A后又派生出C那么C就无法再间接继承A的 成员对A功能的继承在B那儿就终止了;
保持不变。
11 2020/1/2
3.2 继承方式
3.2.2私有继承: 基类各成员无论是何种访问权限在派生类中一律 以private的身份出现,连派生类的对象也无法访问, 只有派生类的函数能在类内访问它们。 若要私有继承来的某些基类的成员函数在派生类 中也能对外可见,需在派生类中对其成员公有化。 • using CAnimal:: SetWeight; // 在派生类中将 基类的成员函数SetWeight( )公有化 • using CAnimal:: GetWeight; // 在派生类中将 基类的成员函数GetWeight( )公有化 例3.2 私有继承中的公有化: sclass3_2.h smain3_2.cpp
3.1.2 派生类的定义 从已有类产生新类的过程就是类的派生。 定义语法如下:
class <派生类名><继承方式>:<基类名1>, <继承方式>:<基类名2>… {
<派生类成员的定义>; }
5 2020/1/2
3.1 类的继承与派生
继承方式分为三种关键字: public private protected;
单继承(只有一个基类名)和多继承; 该公司情况类代码:
企业员工类 相关派生类 P79
经理、销售人员、行政人员这三个派生类在声明语句 中分别指定了它们的基类CCompanyStaff, 以及它 们的继承方式-public;
CSaleManager类,同时继承经理类Cmanager和销售 人员类Csaleman;
而如果B保护继承A后又派生出C那么A中的公有 和保护成员在B中都是保护成员因此A的功能可以 被C间接继承;
数析构函数之外的全部成员函数,但是派生类能否 访问这些成员还要受继承方式的约束;
8 2020/1/2
3.2 继承方式
3.2.1 公有继承 类的继承方式有public、private和protected三
种,其中private是缺省的继承方式; 公有继承:
基类各成员的访问权限如果是public或 protected则在派生类中保持不变而基类中的 private成员对派生类不可见,如图:
12 2020/1/2
3.2 继承方式
私有继承后的基类成员成为了派生类的私有成员, 实际上相当于终止了基类功能的继续派生。
• class <派生类名> : private <基类名> •{ • public: • using <基类名>:: <基类函数名>; // 公有化 • …… • };
13 2020/1/2
6 2020/1/2
3.1 类的继承与派生
3.1.3继承的级别 增加行政主管一职,员工关系图如下:
企业员工
经理
百度文库
销售员
行政人员
2020/1/2
类图
行政主管
7
3.1 类的继承与派生
用C++语言描述三个类的前向引用声明 ,形成了一 个“类家族”:
class CCompanyStaff; //基类员工 //派生类行政人员继承员工 class CAdminStaff : public CCompanyStaff ; //派生类行政主管继承行政人员 class CForeAdmin : public CAdminStaff; 基类不受派生类变化的影响; 派生类继承了基类的全部数据成员和除了构造函
派生类不会影响到原有类的结构。
2 2020/1/2
实例:某一小型公司的实例
企业员工
工作编号 姓名 ……
显示企业员工信息 计算实际发放工资 ……
行政人员 (与企业员工类相 同) 计算实际发放工资 ……
2020/1/2
经理
公司总销售额 提成比例(其余同 企业员工类)
计算实际发放工资 ……
销售人员
个人销售额 提成比例(其余同 企业员工类)