《第三章继承》PPT课件_OK

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过派生类对象访问。
– 例3.1 一个公有继承的例子: • sclass3_3.dev
2021/8/29
12
3.1 类的继承与派生
• private私有继承
– 在私有继承下,基类各成员无论是何种访问区分符在 派生类中一律是private。
– 访问控制 • 被private继承后
– 基类public成员不能在类外通过派生类对象访问; – 基类private成员不能在类外通过派生类对象访问; – 基类protected成员不能在类外通过派生类对象访问。
– 例:CB(int i,int j):CA(i){a=i;}
– 演示:classdemo
• 派生类构造函数的调用顺序为:先基类构造函数后 派生类构造函数;
• 多重继承时按定义基类初始化的顺序,从左到右依 次执行。
– 演示:classdemo 创建CD类对象的调用顺序
2021/8/29
21
3.3 派生类的构造函数和析构函数
企业员工
经理
销售员
代码:行政主管类
2021/8/29
行政人员 行政主管
8
3.1 类的继承与派生
• 定义代码:
– class CCompanyStaff; //基类员工 – class CAdminStaff : public CCompanyStaff //派生类行政
人员继承员工 – class CForeAdmin : public CAdminStaff; //派生类行政主
2021/8/29
11
3.1 类的继承与派生
• public公有继承
– 在公有继承下,基类中所有成员在派生类中的访问区 分符都保持不变。
– 访问控制
• 被public继承后
– 基类public成员仍可在类外通过派生类对象访问; – 基类private成员不能在类外通过派生类对象访问; – 基类protected成员不能在类外(除派生类的派生过 派生类对象访问;
– 基类private成员不能在类外通过派生类对象访问;
– 基类protected成员不能在类外(除派生类的派生类外)通 过派生类对象访问。
– 例3.3 一个protected继承的例子:
• sclass3_3.dev
2021/8/29
2021/8/29
void main() {
A a1; a1.a=1; //1 × a1.c=1; //2 B b1; b1.a=2; //3 × b1.c=2; //4 b1.d=2; //5 }; 问:main函数中哪些 语句会因为访问权限 限制而不可访问?
17
3.2 继承方式
• 多继承 (多个父类):
{ CB cb(2,1);
cout<<"CA a="<<a<<endl;}
system("pause");
~CA(){
return 0;
cout<<"~CA a="<<a<<endl;} int a;
};
} 显示结果?
class CB:public CA{ public:
CB(int j,int i):CA(i) //(1)
2021/8/29
2
3.1 类的继承与派生 企业员工
• 继承
工作编号 姓名 基本工资
– 是将自然界中存显设示置在企基的业本员工普工资遍信息和特殊关系用程序 设计的方式进行计 算分实类际描发述放 工;
– 是软件重用的一资 种形式。
– 继承在设计新类时,允许重用某个原有类的 行政人所员 有特征,并在此销售基经础理 上添加新类的销新售特人员征。
当出月勤出奖–勤励率 被重用的原有公比类例司称总销为售基额提类成(base clas当出s)月勤而出奖新勤励率创建
计算实际发放的工类资 称为派生个类人(销d售er额ived class)。
个人销售额提成比 例
…… – 派生类不会影计响算到实际原发放有工类资 的结构。个计人算销实售际额发放工资
……
……
继承关系,如图:
2021/8/29
18
经该理 关系的C++描销售述人员:
销售部经理
– 类定义代码
• 企业员工类 • 相关派生类
2021/8/29
19
•3.3构派造函生数类: 的构造函数和析构函数
– 派生类数据成员初始化
• 自身定义的数据成员 – 在自身的构造函数进行初始化
• 继承的数据成员 – 在派生类构造函数进行初始化
• 基类不受派生类变化的影响;
– 类CA:FunA();a
• 派生类继承了基类的全部数据成员和除 了构造函数析构函数之外的全部成员函 数
– 类CB:FunA(),FunB();a,b – 类CC:FunA(),FunC(); a,c
• 基类的对象无法使用派生类的成员
CA ca;
ca.FunB(1); (×)
– 例3.2 一个私有继承的例子: • sclass3_3.dev
2021/8/29
13
3.1 类的继承与派生
• protected保护继承
– 在 保 护 继 承 下 , 基 类 public 成 员 的 访 问 区 分 符 变 成 protected,其它维持不变。
– 访问控制
• 被protected继承后
– 在执行派生类的析构函数时基类的析构函数也 将被自动调用;
– 析构函数调用的顺序是先派生类的析构函数, 然后是基类的析构函数(先调用的后析构)
– 例 classdemo
2021/8/29
23
3.3c派las生s C类A{的构造函数和析构函数(练习)int main()
public: CA(int i=0){ a=i;
b,c,d
2021/8/29
A
B
C
D
25
3.4 虚基类
• 解决方法
– 作用域分辨符:可以通过作用域分辨符明确指 定调用哪个类的接口;
• 其语法形式如下 :
– <派生类对象名>.<基类名>::<数据成员名 > // 访问数据成员
– <派生类对象名>.<基类名>::<成员函数名 ><参数表> // 访问成员函数
2021/8/29
20
3.3 派生• 用类带的参构数造的基函类数构和造析函数构初函始数化基类数据成员
– 语法格式: <派生类名>(<形参表>):<基类名1>(<形参表1>)<基类名
2>(<形参表2>) {
<派生类新增数据成员的初始化> }
– 说明:派生类构造函数的形参表中必须包括自身的参数和 基类构造函数的参数
14
3.1 类的继承与派生
• 访问区分符变化表
– 访问区分变化表 – 在派生类中,继承基类成员的访问区分符由
基类成员访问区分符和继承方式共同决定, 取两者中权限限制最高的访问区分符。
2021/8/29
15
3.1 类的继承与派生
练习1 class A {private: int a; protected: int b; public: int c; }; class B : protected A { public: int d; };
– 例:轿车具有交通工具的一般特征,比如轮胎数
目,同时又具有轿车自身的特征,如载客人数,因 此轿车继承交通工具,成为它的一个派生类。
• 例3.4 smain3_4.cpp
2021/8/29
22
3.3 派生类的构造函数和析构函数
• 析构函数
– 当派生类对象消亡时,系统会自动调用派生类的析构 函数做一些必要的清理工作;
管继承行政人员
• 派生类内直接访问基类成员
– 可直接访问基类public/protected成员 – 不可访问基类private成员
– 例3.3 smain3_3.cpp
– protected访问权限:
2021/8/29 • 设计基类时,在隐藏成员的同时还要允许派生类的成员 9
3.1 类的继承与派生
2021/8/29
6
3.1 –类该的公继司承与情派况生类代码:
• 企业员工类
• 继承的级别
– 直接继承
– 间接继承(多重继承)
A
• 例:D->C
• 类CC:FunA();FunC();FunD();a,c,Bd
C
– 增加行政主管一职,员工关系图如下: D
2021/8/29
7
3.1 类的继承与派生
» 例:classdemo在CB类构造函数对a,b初始化。
– 在基类构造函数初始化基类成员 – 用基类构造函数初始化基类数据成员
• 用不带参数的基类构造函数初始化基类数据成员
– 在创建派生类的对象时,会自动调用不带参数(或全 是有缺省参数的基类构造函数;
– 例:classdemoCB类构造函数初始化b,CA类不带参数 的构造函数初始化a。
– 如右图:classdemo – 分析:
• CA:FunA();a • CB: FunA(),FunB();a,b • CC: FunA(),FunC();a,c • CD:
FunA()(从CB中继承), FunA()(从CC中继承), FunB(),FunC(),FunD(); a(从CB中继承), a(从CC中继承),
– 声明多继承的语法如下:
• class <派生类名> : <继承方式> <基A类名1>, <继承方式> <基类名2>, …
– 例:D->B&&D->C
B
C
• Class CD:public CB,public CC
类CD:FunA(),FunB(), a,b,c,d
FunC(),FuDnD();
– 多继承举例:在公司员工管理中有时会存在多
2021/8/29
3
3.1 类的继承与派生

类设计
– 一个一般员工类CCompanyStaff,代表员工的共性;
– 三个新类分别继承一般员工类CCompanyStaff,然后
根据各自的差异性,新类可以对继承来的内容进行
改造。 • 派生类的定义
– 定义语法格式: • class <派生类名 >: <继承方式><基类名1>, <继承方 式>:<基类名2>…
2021/8/29
void main() {
A a1; a1.a=1; //1 × a1.c=1; //2 B b1; b1.a=2; //3 × b1.c=2; //4 × };
问:main函数中哪些 语句会因为访问权限 限制而不可访问?
16
3.1 类的继承与派生
• 练习2 class A {private: int a; protected: int b; public: int c; }; class B : public A { public: int d; };
{ <派生类成员的定义>; }
2021/8/29
4
3.1 类的继承与派生
– 继承方式
• public • private • protected
– 继承关系
• 单继承(只有一个基类名)
A
• 多继承(继承多个父类)
– 继承关系定义实例
B
C
2021/8/29
5
3.1 类的继承与派生
– 基类与派生类的关系
• 作用域分辨符举例:
– classdemo
2021/8/29
26
•3.4定虚义基虚类基类
– 通过虚继承,使原来的基类变为虚基类 – 对于虚基类,则所有派生类成员变量共享一个副
本,成员函数也只有一个映射
– 虚继承声明语法:
• class<派生类名>:virtual<继承方式><基类名>
– 例 classdemo
提纲
第三章 继承
1 类的继承与派生
2
继承方式
3 派生类的构造函数与析构函数
4 虚基类 5 聚合类 6 继承应用实例
2021/8/29
1
3.1 类的继承与派生
• 需求
– 某公司需开发人事管理系统,每个员工都具 有属性:工作编号、姓名、基本工资、月出 勤率;企业需要为每个员工设置基本工资, 员工可以查询基本工资,企业还要计算员工 当月实际发放工资;行政员工的实际工资为基 本工资加奖金,其中奖金与当月的考勤奖励; 销售人员的工资为基本工资和按当月销售额 的一定比例的提成;销售经理的工资为基本 工资、当月考勤奖励和当月销售额的提成。
CA a=1 CB b=2
{ b=j;
~CB a=1 b=2
cout<<"CB b="<<b<<endl;}
~CA a=1
~CB(){ cout<<"~CB a="<<a<<" b="<<b<<endl;}
如果将(1)改为: CB(int j),结果如何?
int b;
};
2021/8/29
24
•3.4多虚继基承类中的多义性
• 类的继承方式 – public 公有继承 – private 私有继承 – protected 保护继承
2021/8/29
10
3.1 类的继承与派生
• 几个重要概念
– 基类类内 – 派生类类内 – 派生类类外 – 继承方式不改变派生类内访问基类成员的权限,
只改变继承后,在派生类外通过派生类对象访 问继承基类成员的权限。
相关文档
最新文档