C++-类的继承和派生ppt课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++-类的继承和派生ppt课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承 派生 ppt 课件
- 资源描述:
-
1、-第四章继承和派生-4.1继承和派生的概念继承和派生的概念面向对象程序设计有面向对象程序设计有4个主要特点个主要特点:抽象抽象、封装封装、继承继承和和多态性多态性。在本章中主要介绍有关继承的知识,在下一章。在本章中主要介绍有关继承的知识,在下一章中将介绍多态性。中将介绍多态性。C+语言提供了类的继承机制,解决了软件重用问题。语言提供了类的继承机制,解决了软件重用问题。4.1.1 继承与派生的概念继承与派生的概念一个类中包含了若干数据成员和成员函数。在不同的类一个类中包含了若干数据成员和成员函数。在不同的类中,数据成员和成员函数是不相同的。但有时两个类的内中,数据成员和成员函数是不相同的。但有时
2、两个类的内容基本相同或有一部分相同。容基本相同或有一部分相同。-类的继承:类的继承:一个新类从已存在的类那里获得该类已有的一个新类从已存在的类那里获得该类已有的特性叫作类的继承。已存在的类叫作特性叫作类的继承。已存在的类叫作父类父类,也叫作,也叫作基类基类。产生的新类叫作产生的新类叫作子类子类或或派生类派生类。类的派生:类的派生:从一个已有的类那里产生一个新类的过程叫从一个已有的类那里产生一个新类的过程叫类的派生。已存在的类叫作类的派生。已存在的类叫作父类父类,也叫作,也叫作基类基类。产生的新。产生的新类叫作类叫作派生类派生类或或子类子类。类的继承和派生是同一概念,前者是从子类的角度来说,类的
3、继承和派生是同一概念,前者是从子类的角度来说,后者是从父类的角度来说的。我们通常说子类继承了父类。后者是从父类的角度来说的。我们通常说子类继承了父类。父类派生了子类。父类派生了子类。-描述各级学生的类的继承关系如下图:描述各级学生的类的继承关系如下图:基类与派生类的关系:基类与派生类的关系:u 派生类是基类的具体化,基类则是派生类的抽象派生类是基类的具体化,基类则是派生类的抽象u 一个派生类的对象也是一个基类的对象。应该具有基类一个派生类的对象也是一个基类的对象。应该具有基类的一切属性和方法。的一切属性和方法。u 派生类除了具有基类的一切属性和方法外,还可以有自派生类除了具有基类的一切属性和方
4、法外,还可以有自己所特有的属性和方法。己所特有的属性和方法。4.1.2 派生类和基类的关系派生类和基类的关系-4.1.3 单继承与多继承单继承与多继承单继承:单继承:一个派生类只从一个基类继承。一个派生类只从一个基类继承。多重继承:多重继承:一个派生类从两个或多个基类继承。一个派生类从两个或多个基类继承。-4.2 派生类的声明方式派生类的声明方式声明派生类的一般形式为声明派生类的一般形式为class 派生类名派生类名:继承方式继承方式 基类名基类名派生类新增加的成员派生类新增加的成员;继承方式包括继承方式包括:public(公有的公有的),private(私有的私有的)和和protected(
5、受保护的受保护的),此项是可选的,如果不写此项,则默,此项是可选的,如果不写此项,则默认为认为private(私有的私有的)。如下程序演示了类如下程序演示了类Rectangle(四边形四边形)由类由类Point继承而来。继承而来。-void SetPoint(int x,int y)this-x=x;this-y=y;void MovePoint(int dx,int dy)x+=dx;y+=dy;void ShowPoint()cout(x,y);/Point.h#include#include using namespace std;class Pointprivate:int x,y;p
6、ublic:int GetX()return x;int GetY()return y;-void SetRect(int x,int y,int w,int h)SetPoint(x,y);width=w;height=h;void ShowRect()cout左上角坐标为:;ShowPoint();coutendl;cout宽为:widthendl;cout长为:heightendl;/Rectangle.h#include#include Point.husing namespace std;class Rectangle:public Pointprivate:int width;in
7、t height;public:int GetWidth()return width;int GetHight()return height;-/main.cpp#include Rectangle.hvoid main()Rectangle r;r.SetRect(0,0,10,20);r.ShowRect();r.MovePoint(10,10);r.ShowRect();-4.3 派生类的构成派生类的构成派生类中的成员包括从基类继承过来的成员和自己增加派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。在基类中包括数据成员和成员函数的成员两大部分。在基类中包括数据成员和成员函
8、数(或称数据或称数据与方法与方法)两部分,派生类分为两大部分两部分,派生类分为两大部分:一部分是从基类继承来一部分是从基类继承来的成员,另一部分是在声明派生类时增加的部分。每一部分均的成员,另一部分是在声明派生类时增加的部分。每一部分均分别包括数据成员和成员函数。分别包括数据成员和成员函数。-如果在派生类中定义了和基类中同名函数(函数参数个数如果在派生类中定义了和基类中同名函数(函数参数个数和类型可以相同也可以不相同),则派生类中的函数会隐藏基和类型可以相同也可以不相同),则派生类中的函数会隐藏基类的同名函数。在派生类中不能直接访问基类中的同名函数。类的同名函数。在派生类中不能直接访问基类中的
9、同名函数。(注意与重载的区别。在同一个类中的同名不同参函数为重载(注意与重载的区别。在同一个类中的同名不同参函数为重载函数)函数)如程序如程序PointRect1所示:所示:-4.4继承方式继承方式派生类的继承方式有三种:派生类的继承方式有三种:public,private,protected。不同的继承方式决定了基类成员在派生类中的访问属性。不同的继承方式决定了基类成员在派生类中的访问属性。继承方式继承方式基类中的访问属性基类中的访问属性派生类中的访问属性派生类中的访问属性publicpublicpublicprotectedprotectedprivate不可访问不可访问privatepu
10、blicprivateprotectedprivateprivate不可访问不可访问protectedpublicprotectedprotectedprotectedprivate不可访问不可访问-4.4.1类的保护成员类的保护成员前面介绍过类的成员前面介绍过类的成员(数据成员和成员函数数据成员和成员函数)的访问属性有的访问属性有私有的私有的(private)(private)的和公有的的和公有的(public(public的的)。另外还提到类的访问。另外还提到类的访问属性也可以有保护的属性也可以有保护的(protected(protected的的)。类中的类中的protected成员与成员
11、与private成员一样,只能在本类成员一样,只能在本类的成员函数中访问,不能在类外通过对象来访问。的成员函数中访问,不能在类外通过对象来访问。但通过上面的表中可以看出当类派生时,基类的但通过上面的表中可以看出当类派生时,基类的private成员成员在派生类中是不可访问的。而基类的在派生类中是不可访问的。而基类的protected成员在派生成员在派生类中随继承方式的不同而不同。类中随继承方式的不同而不同。-class Drived:public Baseprotected:int j;public:void Fun()i=20;#include using namespace std;clas
12、s Baseprotected:int i;public:void F();void main()Drived d;-4.5 派生类的构造函数和析构函数派生类的构造函数和析构函数构造函数的主要作用是对数据成员初始化。构造函数的主要作用是对数据成员初始化。在设计派生类在设计派生类的构造函数时,不仅要考虑派生类所增加的数据成员的初始化,的构造函数时,不仅要考虑派生类所增加的数据成员的初始化,还应当考虑基类的数据成员初始化还应当考虑基类的数据成员初始化。也就是说,希望在执行派。也就是说,希望在执行派生类的构造函数时,使派生类的数据成员和基类的数据成员同生类的构造函数时,使派生类的数据成员和基类的数据
13、成员同时都被初始化。解决这个问题的思路是时都被初始化。解决这个问题的思路是:在执行派生类的构造函在执行派生类的构造函数时,调用基类的构造函数数时,调用基类的构造函数注意:派生类继承基类的除构造函数和析构注意:派生类继承基类的除构造函数和析构函数以外的所有函数。函数以外的所有函数。-4.4.1 简单的派生类的构造函数简单的派生类的构造函数简单的派生类简单的派生类:只有一个基类,而且只有一级派生只有一个基类,而且只有一级派生(只有直接派只有直接派生类,没有间接派生类生类,没有间接派生类),在派生类的数据成员中不包含基类的对,在派生类的数据成员中不包含基类的对象象(即子对象即子对象)。简单派生类中我
14、们一般采用在派生类的构造函数初始化列表简单派生类中我们一般采用在派生类的构造函数初始化列表中调用基类的构造函数来对继承基类的数据成员进行初始化。中调用基类的构造函数来对继承基类的数据成员进行初始化。其一般形式为其一般形式为:派生类构造函数名(总参数表列)派生类构造函数名(总参数表列):基类构造函数名(参数表基类构造函数名(参数表列)列)派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句、简单派生类的构造函数的形式、简单派生类的构造函数的形式-#include#includeusing namespace std;class Student public:Student(int n,s
15、tring nam,char s)num=n;name=nam;sex=s;Student()protected:int num;string name;char sex;-class Student1:public Student public:Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)age=a;addr=ad;void show()coutnum:numendl;coutname:nameendl;coutsex:sexendl;coutage:ageendl;coutaddress:addrend
16、lendl;Student1()private:int age;string addr;-在在main函数中,建立对象函数中,建立对象stud1时指定了时指定了5个实参。它们按个实参。它们按顺序传递给派生类构造函数顺序传递给派生类构造函数Student1的形参。然后,派生类构的形参。然后,派生类构造函数将前面造函数将前面3个传递给基类构造函数的形参。个传递给基类构造函数的形参。-、简单派生类的构造函数的几点说明、简单派生类的构造函数的几点说明a.定义派生类的对象时系统自动调用派生类构造函数之前定义派生类的对象时系统自动调用派生类构造函数之前会先调用其基类的构造函数会先调用其基类的构造函数。基类
17、的构造函数是在派生类的。基类的构造函数是在派生类的构造函数的初始化列表中给出。构造函数的初始化列表中给出。如果在初始化列表中没显式如果在初始化列表中没显式给出调用语句则调用基类的默认构造函数。给出调用语句则调用基类的默认构造函数。例如前例中派生类的构造函数为:例如前例中派生类的构造函数为:Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)如果在如果在main函数中定义一个函数中定义一个Student1类的对象时。系统会先调用基类的构造函数。然后执行类的对象时。系统会先调用基类的构造函数。然后执行Student1的
18、构造函数体内的代码完成对派生类成员的构造。的构造函数体内的代码完成对派生类成员的构造。如果如果Student1类的构造函数改为类的构造函数改为Student1(int n,string nam,char)则会先调用基类的默认构造函数。则会先调用基类的默认构造函数。-.当派生类构造函数在类外定义时,则只在类外的函数当派生类构造函数在类外定义时,则只在类外的函数定义处加上调用基类的初始化列表。在类内申明的地方不加定义处加上调用基类的初始化列表。在类内申明的地方不加.由前面例题中的构造函数由前面例题中的构造函数Student1(int n,string nam,char s,int a,string
19、 ad):Student(n,nam,s)可以看出派可以看出派生类的构造函数的初始化列表中是在调用基类的构造函数而生类的构造函数的初始化列表中是在调用基类的构造函数而不是在申明或定义基类的构造函数。所以不是在申明或定义基类的构造函数。所以Student1中的五中的五个参数是形参个参数是形参(带参数类型带参数类型),而其初始化列表中的,而其初始化列表中的Student的三个参数是实参(不带有类型),这些实参取自的三个参数是实参(不带有类型),这些实参取自Student1,所以,所以Studen中的三个参数也可以为常数。例如中的三个参数也可以为常数。例如可将可将Student1的构造函数改为:的构
20、造函数改为:Student1(string nam,char s,int a,string ad):Student(10010,nam,s);.在派生类对象释放时先执行派生类的析构函数,然后在派生类对象释放时先执行派生类的析构函数,然后执行基类的析构函数。执行基类的析构函数。-例题:定义一个点类例题:定义一个点类Point.由由Point派生出一个圆类派生出一个圆类Circle/Point.h文件文件#ifndef POINT_H#define POINT_Hclass Pointprotected:float x;float y;public:Point()x=0;y=0;Point(flo
21、at x,float y);void Show();#endif/Point.cpp文件文件#include#include Point.husing namespace std;Point:Point(float x,float y)this-x=x;this-y=y;void Point:Show()cout(x,y)endl;-/Circle.h文件#ifndef CIRCLE_H#define CIRCLE_H#include#include Point.husing namespace std;class Circle:public Pointprotected:float r;pu
22、blic:Circle(float x,float y,float r);void Show();float GetArea();float GetLength();#endif/Circle.cpp文件#include#include CirCle.husing namespace std;Circle:Circle(float x,float y,float r):Point(x,y)this-r=r;void Circle:Show()cout圆心为:;Point(x,y).Show();cout半径为:rendl;float Circle:GetArea()return 3.14159
23、*r*r;float Circle:GetLength()return 3.14159*2*r;-4.5.2 有子对象的派生类的构造函数有子对象的派生类的构造函数类的数据成员中还可以包含类对象。例如前面的类的数据成员中还可以包含类对象。例如前面的Student1类类继承自继承自Student类,我们可以在类,我们可以在Student1类中加入一个类中加入一个Student类的对象来表示该同学所在班的班长。如下程序所示:类的对象来表示该同学所在班的班长。如下程序所示:#include#include using namespace std;class Studentpublic:Student(
24、int n,string nam)num=n;name=nam;void display()coutnum:numendlname:nameendl;protected:int num;string name;-class Student1:public Student public:Student1(int n,string nam,int n1,string nam1,int a,string ad):Student(n,nam),monitor(n1,nam1)age=a;addr=ad;void show()cout学生信息为:endl;display();coutage:ageend
25、l;coutaddress:addrendl;cout班长为:endl;monitor.display();private:Student monitor;int age;string addr;-int main()Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road,Shanghai);stud1.show();return 0;派生类构造函数的任务应该包括派生类构造函数的任务应该包括3个部分个部分:(1)对基类数据成员初始化;对基类数据成员初始化;(2)对子对象数据成员初始化;对子对象数据成员初始化;(3)对派生类数据
展开阅读全文