第7章 继承性和派生类PPT讲稿.ppt
《第7章 继承性和派生类PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第7章 继承性和派生类PPT讲稿.ppt(56页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第7章 继承性和派生类第1页,共56页,编辑于2022年,星期一n保持已有类的特性而构造新类的过程称为继承。保持已有类的特性而构造新类的过程称为继承。n在已有类的基础上新增自己的特性而产生新类的过在已有类的基础上新增自己的特性而产生新类的过程称为派生。程称为派生。n被继承的已有类称为基类(或父类)。被继承的已有类称为基类(或父类)。n派生出的新类称为派生类。派生出的新类称为派生类。7.1 基类和派生类第2页,共56页,编辑于2022年,星期一继承与派生问题举例工具车工具车面包车面包车轿车轿车小汽车小汽车卡车卡车旅行车旅行车汽车汽车交通工具交通工具第3页,共56页,编辑于2022年,星期一继承与
2、派生问题举例猴子猴子老虎老虎豹豹狮狮 子子猫猫鸟鸟动物动物第4页,共56页,编辑于2022年,星期一继承与派生问题举例圆圆矩形矩形几何形状几何形状第5页,共56页,编辑于2022年,星期一继承与派生问题举例兼职技术人员兼职技术人员销售经理销售经理管理人员管理人员销售人员销售人员雇员雇员第6页,共56页,编辑于2022年,星期一继承与派生的目的n继承的目的:实现代码重用。继承的目的:实现代码重用。n派生的目的:当新的问题出现,原有程派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需序无法解决(或不能完全解决)时,需要对原有程序进行改造。要对原有程序进行改造。第7页,共56页,编
3、辑于2022年,星期一n继承关系,描述了派生类与基类之间的继承关系,描述了派生类与基类之间的“是是”关系,派生类是基类中的一种,是它的具体化。关系,派生类是基类中的一种,是它的具体化。n组合关系,又称包含关系,一个类中有另一组合关系,又称包含关系,一个类中有另一个类中的对象,表现两者之间的个类中的对象,表现两者之间的“有有”的关系。的关系。类与类之间的关系第8页,共56页,编辑于2022年,星期一单重继承和多重继承单重继承和多重继承继承可分为:继承可分为:n单重继承,指生成的派生类只有一个基类。单重继承,指生成的派生类只有一个基类。n多重继承,是指生成的派生类有两个或两个以上多重继承,是指生成
4、的派生类有两个或两个以上的基类。的基类。两者的区别仅在于所继承基类数不同两者的区别仅在于所继承基类数不同第9页,共56页,编辑于2022年,星期一 派生类定义格式如下:派生类定义格式如下:class class :;7.1.1 派生类的定义第10页,共56页,编辑于2022年,星期一n不同继承方式的影响主要体现在不同继承方式的影响主要体现在n派生类成员派生类成员对基类成员的访问权限对基类成员的访问权限n通过通过派生类对象派生类对象对基类成员的访问权限对基类成员的访问权限n继承方式包含以下继承方式包含以下3 3种:种:publicpublic(公有的方式);(公有的方式);privatepriv
5、ate(私有的方式);(私有的方式);protectedprotected(保护的方式)。(保护的方式)。n默认方式:对默认方式:对classclass来讲是来讲是privateprivate;对;对structstruct来讲是来讲是publicpublic。7.1.2 派生类的三种继承方式第11页,共56页,编辑于2022年,星期一 基类中的私有成员无论哪种继承方式在派生类中都是基类中的私有成员无论哪种继承方式在派生类中都是不能直接访问的。不能直接访问的。在公有继承方式下,基类中公有成员和保护成员在公有继承方式下,基类中公有成员和保护成员在派生类中仍然是公有成员和保护成员。在派生类中仍然是
6、公有成员和保护成员。在私有继承方式下,基类中公有成员和保护成员在在私有继承方式下,基类中公有成员和保护成员在派生类中都为私有成员。派生类中都为私有成员。在保护继承方式下,基类中公有成员和保护成员在派在保护继承方式下,基类中公有成员和保护成员在派生类中都为保护成员。生类中都为保护成员。7.1.3 基类成员在派生类中的访问权限第12页,共56页,编辑于2022年,星期一 基类成员在派生类中访问权限基类成员在派生类中访问权限 基类私有不可访问,公有不变,私有私有,保护保护。基类私有不可访问,公有不变,私有私有,保护保护。基类中成员基类中成员公有继承公有继承私有继承私有继承保护继承保护继承私成员私成员
7、不可访问不可访问不可访问不可访问不可访问不可访问公成员公成员公有公有私有私有保护保护保护成员保护成员保护保护私有私有保护保护第13页,共56页,编辑于2022年,星期一7.1.4 成员访问权限的控制(1)(1)公有继承方式公有继承方式class Pointclass Point/基类基类基类基类PointPoint类的声明类的声明类的声明类的声明public:public:/公有函数成员公有函数成员公有函数成员公有函数成员void InitP(float xx=0,float yy=0)X=xx;Y=yy;void InitP(float xx=0,float yy=0)X=xx;Y=yy;v
8、oid Move(float xOff,float yOff)X+=xOff;Y+=yOff;void Move(float xOff,float yOff)X+=xOff;Y+=yOff;float GetX()return X;float GetX()return X;float GetY()return Y;float GetY()return Y;private:private:/私有数据成员私有数据成员私有数据成员私有数据成员float X,Y;float X,Y;例例1第14页,共56页,编辑于2022年,星期一class Rectangle:public Point /class
9、 Rectangle:public Point /派生类声明派生类声明派生类声明派生类声明 public:public:/新增公有函数成员新增公有函数成员新增公有函数成员新增公有函数成员void InitR(float x,float y,float w,float h)void InitR(float x,float y,float w,float h)InitPInitP(x,y);W=w;H=h;(x,y);W=w;H=h;/调用基类公有成员函数调用基类公有成员函数调用基类公有成员函数调用基类公有成员函数float GetH()return H;float GetH()return H;
10、float GetW()return W;float GetW()return W;private:private:/新增私有数据成员新增私有数据成员新增私有数据成员新增私有数据成员float W,H;float W,H;例例1第15页,共56页,编辑于2022年,星期一#include#include#include#includeusing namecpace std;using namecpace std;int main()int main()Rectangle rect;Rectangle rect;rect.InitR(2,3,20,10);rect.InitR(2,3,20,10
11、);/通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员rect.Move(3,2);rect.Move(3,2);coutrect.GetX(),rect.GetY(),coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;rect.GetH(),rect.GetW()endl;return 0;return 0;例例1第16页,共56页,编辑于2022年,星期一 class B:public A public:void f2();protected:int j2;
12、private:int i2;class C:public B public:void f3();#include#include class A class A public:public:void f1();void f1();protected:protected:int j1;int j1;private:private:int i1;int i1;例例2第17页,共56页,编辑于2022年,星期一 class B:A/class默默认私有私有继承承 public:void h()coutBn;A:f;/引入本作用域引入本作用域 ;void main()B b;b.f(10);b.g(
13、);/错 b.h();#include#include class A class A public:public:void f(int i)void f(int i)coutiendl;coutiendl;void g()void g()coutAn;coutAn;(2 2)私有继承方式)私有继承方式第18页,共56页,编辑于2022年,星期一(3)保护继承方式nprotected protected 成员的特点与作用成员的特点与作用n对建立其所在类对象的模块来说,它与对建立其所在类对象的模块来说,它与 private private 成员的性质相同。成员的性质相同。n对于其派生类来说,它与
14、对于其派生类来说,它与 public public 成员的性质成员的性质相同。相同。n既实现了数据隐藏,又方便继承,实现代码既实现了数据隐藏,又方便继承,实现代码重用。重用。第19页,共56页,编辑于2022年,星期一 class B:protected A public:B(const char*str):A(str)void Print()coutnameendl;void main()B b(Zhang);b.Print();#include#include#include#include class A class A public:public:A(const char*str)A(
15、const char*str)strcpy(name,str);strcpy(name,str);protected:protected:char name80;char name80;第20页,共56页,编辑于2022年,星期一 class C:protected B public:void f4();protected:int c1;private:int c2;class D:private C public:void f5();protected:int d1;private:int d2;例例 分析下列程序,并填写不同成员在不同类的访问权限。分析下列程序,并填写不同成员在不同类的访问
16、权限。#include#include class A class A public:public:void f1();void f1();protected:protected:int a1;int a1;private:private:int a2;int a2;class B:public A class B:public A public:public:void f2();void f2();protected:protected:void f3();void f3();private:private:int b;int b;第21页,共56页,编辑于2022年,星期一 成成员类员类f
17、1f1()()a1a1a2a2f2f2()()f3f3()()b bf4f4()()c1c1c2c2f5f5()()d1d1d2d2类类A A(基(基类类)公公有有保保护护私私有有类类B B(公(公继继)公公有有保保护护不不可可访访公公有有保保护护私私有有类类C C(保(保继继)公公有有保保护护私私有有类类D D(私(私继继)公公有有保保护护私私有有第22页,共56页,编辑于2022年,星期一单重继承指的是仅有一个基类的派生继承。单重继承指的是仅有一个基类的派生继承。猴子猴子狮子狮子虎虎猎豹猎豹猫猫鸟鸟动物动物7.2 单继承第23页,共56页,编辑于2022年,星期一n构造函数不能继承。构造函
18、数不能继承。n派生类的构造函数承担着对基类中数据成员初始派生类的构造函数承担着对基类中数据成员初始化和对派生类自身数据成员初始化的双重任务。化和对派生类自身数据成员初始化的双重任务。n析构函数不能继承。析构函数不能继承。n派生类的析构函数应包含着基类的析构函数,用来派生类的析构函数应包含着基类的析构函数,用来释放基类中的数据成员。释放基类中的数据成员。7.2.1 派生类的构造函数和析构函数第24页,共56页,编辑于2022年,星期一n派生类的构造函数应该包含它的直接基类的构造函派生类的构造函数应该包含它的直接基类的构造函数。定义格式如下:数。定义格式如下:():):(),1 1派生类的构造函数
19、派生类的构造函数7.2.1 派生类的构造函数和析构函数第25页,共56页,编辑于2022年,星期一 派生类构造函数的执行顺序如下:派生类构造函数的执行顺序如下:n 先执行基类构造函数;先执行基类构造函数;n再执行子对象的构造函数(如有子对象的话);再执行子对象的构造函数(如有子对象的话);n最后执行派生类构造函数的函数体。最后执行派生类构造函数的函数体。掌握派生类构造函数时应注意如下两点 派生类构造函数的成员初始化列表中应该显式地包含基派生类构造函数的成员初始化列表中应该显式地包含基类中带参数的构造函数,或者隐含地包含基类中的默认构类中带参数的构造函数,或者隐含地包含基类中的默认构造函数。造函
20、数。第26页,共56页,编辑于2022年,星期一n由于析构函数不能继承,因此在派生类的析构函数中要由于析构函数不能继承,因此在派生类的析构函数中要包含它的直接基类的析构函数。包含它的直接基类的析构函数。n派生类析构函数的执行顺序如下:派生类析构函数的执行顺序如下:2 2派生类的析构函数派生类的析构函数n最后执行直接基类中的析构函数。最后执行直接基类中的析构函数。n再再执执行行子子对对象象所所在在类类的的析析构构函函数数(如如果果有有子子对对象象的的话)话)n先执行派生类析构函数的函数体先执行派生类析构函数的函数体第27页,共56页,编辑于2022年,星期一例例例例 派生类构造函数的执行顺序派生
21、类构造函数的执行顺序派生类构造函数的执行顺序派生类构造函数的执行顺序#include#include class A class A public:public:A()A()a=0;a=0;coutDefault constructor called.aendl;coutDefault constructor called.aendl;A(int i)A(int i)a=i;a=i;coutConstructor called.aendl;coutConstructor called.aendl;A()coutDestructor called.aendl;A()coutDestructor
22、called.aendl;void Print()couta,;void Print()couta,;int Geta()return a;int Geta()return a;private:private:int a;int a;第28页,共56页,编辑于2022年,星期一 void main()B bb2;bb0=B(7,8,9);bb1=B(12,13,14);for(int i=0;i2;i+)bbi.Print();class B:public Aclass B:public A public:public:B()B()b=0;b=0;coutDefault constructor
23、 called.bendl;coutDefault constructor called.bendl;B(int i,int j,int k):A(i),aa(j)B(int i,int j,int k):A(i),aa(j)b=k;b=k;coutConstructor called.bendl;coutConstructor called.bendl;B()coutDestructor called.bendl;B()coutDestructor called.bendl;void Print()void Print()A:Print();A:Print();coutb,aa.Geta()
24、endl;coutb,aa.Geta()endl;private:private:int b;int b;A aa;A aa;第29页,共56页,编辑于2022年,星期一 class B:public A public:B()b1=b2=0;B(int i)b1=0;b2=i;B(int i,int j,int k):A(i),b1(j),b2(k)B()coutIn B.n;void Print()A:Print();coutb1,b2,;private:int b1,b2;例例例例 多层派生类构造函数和析构函数。多层派生类构造函数和析构函数。多层派生类构造函数和析构函数。多层派生类构造函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 继承性和派生类PPT讲稿 继承 派生 PPT 讲稿
限制150内