




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++大学基础教程第8章继承与派生
北京邮电大学信通院 网络搜索中心2025/2/9北京邮电大学电信工程学院计算机技术中心-2-第8章继承与派生8.1继承的概念8.2继承方式8.3派生类构造函数的定义8.4多继承2025/2/9北京邮电大学电信工程学院计算机技术中心-3-第8章继承与派生面向对象的特征
1、封装性2、继承性
3、多态性继承的作用:软件重用2025/2/9北京邮电大学电信工程学院计算机技术中心-4-继承的概念普通自行车2025/2/9北京邮电大学电信工程学院计算机技术中心-5-继承的概念双人自行车2025/2/9北京邮电大学电信工程学院计算机技术中心-6-继承的概念比赛自行车2025/2/9北京邮电大学电信工程学院计算机技术中心-7-继承的概念山地自行车2025/2/9北京邮电大学电信工程学院计算机技术中心-8-继承的概念2025/2/9北京邮电大学电信工程学院计算机技术中心-9-
8.1继承的概念
2025/2/9北京邮电大学电信工程学院计算机技术中心-10-8.1继承的概念
类的继承:是在现有类的基础之上,创建新类的机制。称现有的类为基类,新建立的类为派生类。新类继承了基类的属性和行为新类是基类的特殊情况。继承是处理“特殊情况”的面向对象编程机制
-11-继承的概念基类(父类)派生类(子类)派生类派生类2025/2/9北京邮电大学电信工程学院计算机技术中心-12-单继承
派生类只有一个直接基类的继承多继承
派生类有多个直接基类的继承直接基类
派生出子类的父类称为该子类的直接基类间接基类
父类的父类称为该子类的间接基类继承的概念ABCABC2025/2/9北京邮电大学电信工程学院计算机技术中心-13-
8.2继承方式
2025/2/9北京邮电大学电信工程学院计算机技术中心-14-派生类的定义格式
class派生类名:继承方式
基类名{public://派生类公有成员…
protected://派生类保护成员…
private://派生类私有成员…};派生类只有一个直接基类为单继承继承方式:publicprivateprotected2025/2/9北京邮电大学电信工程学院计算机技术中心-15-例子基类:shape:位置、颜色派生类:
Circle:位置、颜色、半径、画圆Rectangle:位置、颜色、长、宽、画矩形triangle:位置、颜色、边长、画三角形-16-例:定义基类shapeclass
shape{protected:
int
m_x,m_y;//位置
char
m_color;//颜色public:
void
setposition(int
x,int
y);
void
setcolor(char
color);
int
getx()const;
int
gety()const;
char
getcolor()const;};-17-定义派生类(圆形类)classCircle:publicShape{public:
Circle(int
x,int
y,floatr,char
color='R');
float
GetRadius()const;
void
SetCircle(int
x,int
y,float
r,char
color);
void
Draw();protected:
float
m_radius;};-18-定义派生类(等边三角形类)classTriangle:publicShape{public:
Triangle(int
x,int
y,char
color='R',float
slen=1);
float
GetSideLength()const;
void
SetTriangle(int
x,int
y,char
color,float
slen);
void
Draw();private:
float
m_SideLength;};-19-定义派生类(矩形类)classRectangle:publicShape{public:
Rectangle(int
x,int
y,char
color='R',intLength=5,int
width=5);
float
GetWidth()const;
float
GetHeight()const;
void
SetRectangle(int
x,int
y,char
color,intLength,int
width);
void
Draw();private:
float
m_Width,m_Length;};2025/2/9北京邮电大学电信工程学院计算机技术中心-20-派生新类:circle圆形rectangle矩形triangle三角形
基类称为父类派生类称为子类
shapecirclerectangletriangle2025/2/9北京邮电大学电信工程学院计算机技术中心-21-派生类的定义格式
class派生类名:继承方式基类名1,…继承方式基类名n{public://派生类公有成员…
protected://派生类保护成员…
private://派生类私有成员…};有多个基类派生类有多个基类为多继承2025/2/9北京邮电大学电信工程学院计算机技术中心-22-例:已有基类base1,base2,base3,定义派生类deriverclassderiver:publicbase1,publicbase2,privatebase3{private:
int
m_derdata;public:
void
derfunction();};2025/2/9北京邮电大学电信工程学院计算机技术中心-23-8.2派生类的继承派生类的成员包括
1、基类的成员(构造函数和析构函数除外)
2、派生类定义的成员软件复用2025/2/9北京邮电大学电信工程学院计算机技术中心-24-8.2派生类的继承问题:派生类的成员和基类的成员同名?
派生类的成员覆盖基类的同名成员,即派生类的对象只能访问到派生类的同名成员。2025/2/9北京邮电大学电信工程学院计算机技术中心-25-同名覆盖的例子classbase{public:voidprint(){cout<<“basefunction”<<endl;}};classderiver:publicbase{public:voidprint(){cout<<“deriverfunction”<<endl;}};voidmain(){base*pBobj;
pBobj->print();deriverobj;
pBobj=&obj;pBobj->print();}2025/2/9北京邮电大学电信工程学院计算机技术中心-26-同名覆盖的思考1、派生类和基类的成员函数名相同,但形参不同,或返回值不同,则派生类对象能够调用基类的同名成员吗?2025/2/9北京邮电大学电信工程学院计算机技术中心-27-8.2继承方式继承方式的作用
派生类对象:对基类成员的访问控制继承方式的作用范围
只用于限制对紧随其后之基类的继承三种继承方式
公有继承public
保护继承protected
私有继承private
2025/2/9北京邮电大学电信工程学院计算机技术中心-28-1.公有继承
公有继承的派生类定义形式:
class派生类名:public
基类名{派生类新成员定义;}2025/2/9北京邮电大学电信工程学院计算机技术中心-29-2.私有继承
私有继承的派生类定义形式:
class派生类名:private
基类名{派生类新成员定义;}2025/2/9北京邮电大学电信工程学院计算机技术中心-30-3.保护继承保护继承的派生类定义形式:class派生类名:protected
基类名{派生类新成员定义;}2025/2/9北京邮电大学电信工程学院计算机技术中心-31-8.2继承方式类成员的存取方式存取方式本类成员函数派生类成员函数类对象private√××protected√√×public√√√2025/2/9北京邮电大学电信工程学院计算机技术中心-32-8.2继承方式派生类继承后的基类成员的存取方式继承方式基类存取方式privateprotectedpublicprivateprivateprivateprivateprotectedprivateprotectedprotectedpublicprivateprotectedpublic2025/2/9北京邮电大学电信工程学院计算机技术中心-33-8.2继承方式小结实际上我们使用继承时,都是公有继承,私有和保护继承仅仅在理论上讨论。2025/2/9北京邮电大学电信工程学院计算机技术中心-34-
8.3派生类的构造函数
2025/2/9北京邮电大学电信工程学院计算机技术中心-35-8.3派生类构造函数的定义
派生类继承的特殊性
基类中的构造函数和析构函数不能继承派生类需要自己定义构造函数和析构函数。2025/2/9北京邮电大学电信工程学院计算机技术中心-36-8.3派生类构造函数的定义派生类的构造函数要求:
1、基类构造函数需要的参数
2、内嵌对象需要的初始化参数
3、本类基本数据类型需要的参数2025/2/9北京邮电大学电信工程学院计算机技术中心-37-8.3派生类构造函数的定义派生类的构造函数
派生类名::派生类名(基类的形参,本类的形参):基类名(参数),对象成员(参数)
{
//函数体
}2025/2/9北京邮电大学电信工程学院计算机技术中心-38-8.3派生类析构函数的定义派生类的析构函数的作用只负责清理它新定义的非对象数据成员,对象数据成员由对象成员所属类的析构函数负责析构。-39-派生与继承的实例
公司人员管理系统:
小型公司人员分为:经理、兼职技术人员、销售经理和兼职推销员.要求:存储所有人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。程序能够对不同人员按不同方法计算月薪:经理拿固定月薪;兼职技术人员按工作小时数领取月薪;兼职推销员的报酬按该推销员当月销售额提成;销售经理既拿固定月薪也领取销售提成。
2025/2/9北京邮电大学电信工程学院计算机技术中心-40-派生与继承的实例
分析:
1、描述全体职员的共性(基类)2、每一类特殊人员(派生类)之间的关系,描述各自特有的属性或行为虚拟继承EmployeeTechnicianManagerSalemanSaleManager2025/2/9北京邮电大学电信工程学院计算机技术中心-41-派生与继承的实例1、描述全体职员的共性(基类)属性:姓名、编号、级别、当月薪水行为:显示全部信息静态成员:人员信息编号-42-class
employee{protected:
char
name[10]; //姓名
int
EmpNo; //编号
int
grade; //级别
float
accumPay; //月薪总额
static
int
employeeNo; //本公司职员编号目前最大值public:
employee(char*newN,intnewG);//构造函数
~employee(); //析构函数
void
displayStatus(); //显示人员信息};
-43-classManager:public
employee{protected:
float
salary;public:
Manager(char
*newName,int
newGrade,float
newS);
void
pay();//计算月薪函数
void
displayStatus(); //显示全部信息};新增加的成员同名覆盖,改造基类成员
构造函数-44-classTechnician:public
employee{protected:
int
workhour;
float
hourlyrate;public:
Technician(char*newName,int
newGrade);//构造函数
void
pay(); //计算月薪函数
void
displayStatus(); //显示全部信息};新增加的成员同名覆盖,改造基类成员
构造函数-45-classsaleman:public
employee{protected:
float
salesamount;//销售额
float
persale;//提成比率public:
saleman(char*newName,int
newGrade);
void
pay(); //计算月薪函数
void
displayStatus(); //显示全部信息};新增加的成员同名覆盖,改造基类成员
构造函数-46-classsaleManager:public
employee{protected:
float
salary;
float
salesamount;
float
persale;public:
saleManager(char*newName,int
newGrade,float
newS);
void
pay(); //计算月薪函数
void
displayStatus(); //显示全部信息};新增加的成员同名覆盖,改造基类成员
构造函数2025/2/9北京邮电大学电信工程学院计算机技术中心-47-Manager::Manager(char*newName,intnewGrade,float
newS):employee(newName,newGrade),salary(newS){}void
Manager::pay(){
cout<<"固定月薪:"<<salary<<",是否更新?(Y/N)";
char
ch; cin>>ch;
if(ch=='y') {
cout<<"请重新输入经理月薪:"; cin>>salary; }
accumPay=salary;}构造函数2025/2/9北京邮电大学电信工程学院计算机技术中心-48-void
Manager::displayStatus(){ cout<<"姓名:"<<name<<endl;cout<<"编号:"<<EmpNo<<endl; cout<<"级别:经理"<<endl; cout<<"固定月薪:"<<accumPay<<endl;}2025/2/9北京邮电大学电信工程学院计算机技术中心-49-voidmain(){ Managerm("李宁",1,5000); m.pay(); m.displayStatus(); Techniciant("王二",2); t.pay(); t.displayStatus(); salemans("张三",3);s.pay(); s.displayStatus();saleManagersm("周君",4,3000); sm.pay(); sm.displayStatus();}2025/2/9北京邮电大学电信工程学院计算机技术中心-50-继承的含义派生类的成员包括:1.从基类继承的成员;2.改造基类成员;3.添加派生类新成员.2025/2/9北京邮电大学电信工程学院计算机技术中心-51-9.3派生类构造函数的定义构造函数的调用顺序
1、基类的构造函数
2、内嵌对象的构造函数
3、派生类的构造函数析构函数的调用顺序与构造函数的调用顺序正好相反2025/2/9北京邮电大学电信工程学院计算机技术中心-52-
8.4多继承
2025/2/9北京邮电大学电信工程学院计算机技术中心-53-8.4多继承8.4.1多继承与二义性多继承类结构中,派生类可能有多个直接基类或间接基类,充分体现了软件重用的优点,但也可能会引起成员访问的二义性或不确定性问题。-54-employeeManagersalemansalemanagerNameEmpNoGradeaccumPay……ManagerNameEmpNoGradeaccumPay……saleman……salemanagerSalemanager中调用Name时,产生二义性2025/2/9北京邮电大学电信工程学院计算机技术中心-55-8.4.2虚基类
为解决二义性问题,将共同基类设置为虚基类,创建派生类对象时,虚基类的构造函数只会调用一次,虚基类的成员在第三层派生类对象中就只有一份拷贝,不会再引起二义性问题。2025/2/9北京邮电大学电信工程学院计算机技术中心-56-虚基类
语法形式:
class派生类名:virtual
继承方式基类名{//……}在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧随其后的基类起作用。
2025/2/9北京邮电大学电信工程学院计算机技术中心-57-虚基类
注意:在第一级继承时就要将共同基类设计为虚基类。2025/2/9北京邮电大学电信工程学院计算机技术中心-58-多继承派生类构造函数的定义
在包含虚基类的继承结构中,系统在建立派生类的对象时,调用构造函数的顺序是:(1)虚拟基类的构造函数;(2)非虚拟基类的构造函数;(3)内嵌对象的构造函数;(4)派生类的构造函数。-59-习题:补全派生类的构造函数classA{public:
inti;A(inta){i=a;}
virtualvoidprint(){cout<<“A”<<endl;}};classB:publicA{public:
intj;voidprint(){cout<<“B”<<endl;}};classC:publicB{public:
intk;voidprint(){cout<<“C”<<endl;}};2025/2/9北京邮电大学电信工程学院计算机技术中心-60-作业课后第6题2025/2/9北京邮电大学电信工程学院计算机技术中心-61-复习第8章1、单继承2、多继承3、虚拟继承
ABCABC-62-
classA{public:
inti;A(inta){i=a;}};classB:publicA{public:
intj;B(inta,intb):A(a){j=b;}};classC:publicB{public:
intk;C(inta,intb,intc):B(a,b){k=c;}};voidmain(){Cc(1,2,3);cout<<c.i<<endl;cout<<c.j<<endl;cout<<c.k<<endl;}ABCpublici=1publicj=2publick=3C()~C()C(C&)cpublici=1publicj=2B()~B()B(B&)B-63-
classA{public:
inti;A(inta){i=a;}};classB:privateA{public:
intj;B(inta,intb):A(a){j=b;}};classC:publicB{public:
intk;C(inta,intb,intc):B(a,b){k=c;}};voidmain(){Cc(1,2,3);cout<<c.j<<endl;cout<<c.k<<endl;}ABC不可见
i=1publicj=2publick=3C()cprivatei=1publicj=2B()B2025/2/9北京邮电大学电信工程学院计算机技术中心-64-A(inta){i=a;}B(inta,intb):A(a){j=b;}//直接基类C(inta,intb,intc):B(a,b){k=c;}//直接基类构造顺序:A->B->CABC2025/2/9北京邮电大学电信工程学院计算机技术中心-65-复习第8章1、单继承2、多继承3、虚拟继承-66-
classA{public:
inti;A(inta){i=a;}};classB{public:
intj;B(intb){j=b;}};classC:publicA,publicB{public:
intk;C(inta,intb,intc):A(a),B(b){k=c;}};voidmain(){Cc(1,2,3);cout<<c.i<<endl;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 6 my clothes,my style grammar教学设计 - 2024-2025学年译林版(2024)英语七年级上册
- 2025年全麦面包项目合作计划书
- 室内不锈橱窗行业深度研究报告
- 2025年度精装修公寓承包装修设计施工合同
- 《14学习有方法》(教学设计)-部编版道德与法治二年级下册
- 2025年度精装修住宅楼房地产买卖合同(拎包入住)
- 2025年工程机械专用油合作协议书
- 2025年度新材料研发股权投资合同
- 2025年度航空航天控制系统采购协议范本
- 汽车综合服务市场建设项目可行性研究报告
- 抗震支架安装工程施工方案范文
- GB/T 45071-2024自然保护地分类分级
- 农业托管合同范例
- 食品中阿维菌素等55种农药最大残留限量
- 保洁部消杀培训
- 口服轮状疫苗知识课件
- 中国脑小血管病诊治指南2023版
- 中国聚乙烯催化剂行业发展状况及需求规模预测研究报告(2024-2030版)
- 新能源汽车驱动电机及控制系统检修课件 学习情境4:电的转换
- 车辆实际使用权协议书范文模板
- 新版加油站全员安全生产责任制
评论
0/150
提交评论