《高级程序设计》PPT课件.ppt

上传人:小飞机 文档编号:5623732 上传时间:2023-08-03 格式:PPT 页数:41 大小:232.99KB
返回 下载 相关 举报
《高级程序设计》PPT课件.ppt_第1页
第1页 / 共41页
《高级程序设计》PPT课件.ppt_第2页
第2页 / 共41页
《高级程序设计》PPT课件.ppt_第3页
第3页 / 共41页
《高级程序设计》PPT课件.ppt_第4页
第4页 / 共41页
《高级程序设计》PPT课件.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《《高级程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《高级程序设计》PPT课件.ppt(41页珍藏版)》请在三一办公上搜索。

1、高级程序设计,主 讲:李晓勇Email:Telphone:,一、继承总结,继承方式:public:公有继承 protected:保护继承 private:私有继承访问控制属性:public:公有类型 protected:保护类型 private:私有类型,继承方式与访问控制属性,公有继承:基类的公有成员和保护成员作为派生类公有成员时,保持不变,但基类的私有成员不可访问。私有继承:基类的公有成员和保护成员作为派生类私有成员,变成私有,但基类的私有成员不可访问。保护继承:基类的公有成员和保护成员作为派生类保护成员,变成保护,但基类的私有成员不可访问。,不同继承方式的基类/派生类特性,基类/派生类的

2、关系,任何一个类都可以派生出一个新类,派生类也可以派生出新的类,即一个基类是另一个基类的派生类,构成了类的层次结构。,A,B,C,A 是 B 的基类,B 是 C 基类;称 B 是 A 的直接派生类;A 是 C 的间接基类;,二、继承与构造函数/析构函数,1、问题:类都有构造函数/析构函数,基类/派生类也有。则(1)派生类和基类的构造函数和析构函数是如何被调用的?(2)基类构造函数是如何获得实际参数的?,2、规则:,(1)派生类并不继承基类的构造/析构函数,相反派生类的构造函数必须向基类的构造函数提供实参。(2)创建一个派生类的对象时,则先调用基类的构造函数,然后调用派生类的构造函数;派生类的对

3、象被撤销时析构函数的调用次序相反。,3、派生类构造函数的形式,():(参数),(参数)例:B:B(int i,int k):A(i)b=k;coutBs createendl;,初始化列表,举例:从vehicle(汽车)派生car(小汽车)类。,#include class vehicle/基类vehicle类的声明private:/私有数据成员 int wheels;protected:/保护数据成员 float weight;public:/公有函数成员 vehicle(int in_wheels,float in_weight)wheels=in_wheels;weight=in_wei

4、ght;int get_wheels()return wheels;float get_weight()return weight;,/派生类car类的声明class car:public vehicle private:/新增私有数据成员 int passenger_load;public:/新增公有函数成员 car(int in_wheels,float in_weight,int people=5):vehicle(in_wheels,in_weight)passenger_load=people;int get_passengers()return passenger_load;,vo

5、id main()car bluebird(4,1000);/声明car类的对象 coutThe message of bluebird(wheels,weight,passengers):endl;coutbluebird.get_wheels(),/输出小汽车的信息 bluebird.get_weight(),bluebird.get_passengers()endl;程序运行结果为:The message of bluebird(wheels,weight,passengers):4,1000,5,例,继承中的构造/析构函数,class Apublic:A()a=0;coutAs def

6、ault createendl;A(int i)a=i;coutAs createendl;A()coutAs deletedendl;void aprint()couta,;int geta()return a;private:int a;,class B:public Apublic:B()b=0;coutBs default createendl;B(int i,int j,int k);B()coutBs deletedendl;void print();private:int b;A aa;/类成为数据成员;B:B(int i,int j,int k):A(i),aa(j)b=k;c

7、outBs createendl;,void B:print()aprint();coutb,aa.geta()endl;void main()B bb2;bb0=B(1,2,5);bb0.print();,As default createAs default createBs default createAs default createAs default createBs default createAs createAs createBs createBs deletedAs deletedAs deleted1,5,2Bs deletedAs deletedAs deletedBs

8、 deletedAs deletedAs deleted,结论:创建一个派生类的对象时,构造函数的执行次序:(1)先调用基类的构造函数(2)子对象类的构造函数(3)派生类的构造函数派生类的对象被撤销时,析构函数的执行次序:析构函数的调用次序与构造函数相反。,三、同名覆盖原则但派生类中存在同基类同名的成员时,派生类覆盖基类;可通过基类名加上”:”在派生类中对基类中的成员进行访问,#includeclass CAprotected:int x,y;public:void set(int m,int n)x=m;y=n;,class CB:public CAprotected:int x,y;pub

9、lic:void set(int m,int n)x=m;y=n;CA:set(m+2,n+3);void main()CB b;b.CA:set(3,4);b.set(23,45);,四、多继承,1、概念多继承(多重继承):为一个派生类指定多个基类。或者说,一个子类从多个基类中派生出来,它继承了多个类的基本特性。,2、派生类的定义,单继承派生类的定义格式:class:;多继承派生类的定义格式:class:,;,说明:(1)派生类与每个类之间的关系仍可看作是一个单继承。(2)多个基类中的成员相同时,通过子类的对象调用时,无法确定是哪一个基类的成员,容易产生二义性。,例,床/沙发/折叠沙发,cl

10、ass bed/多重继承public:bed():weight(0)void sleep()coutSleeping.n;void setweight(int i)weight=i;protected:int weight;class sofapublic:sofa():weight(0)void watchtv()cout“Watching tv.n;void setweight(int i)weight=i;protected:int weight;,class sleepersofa:public bed,public sofapublic:sleepersofa()void foldo

11、ut()coutFold out the sofa.n;void main()sleepersofa ss;ss.watchtv();ss.foldout();ss.sleep();ss.sofa:setweight(90);/ss.setweight(90)错,watching tv.Fold out the sofa.sleeping,例、多重继承与构造函数的关系,class B1 public:B1(int i)b1=i;coutconstructor B1.-iendl;void print()coutb1endl;private:int b1;class B2public:B2(in

12、t i)b2=i;coutconstructor B2.-iendl;void print()coutb2endl;private:int b2;class B3public:B3(int i)b3=i;coutconstructor B3.-iendl;int getb3()return b3;private:int b3;,class A:public B2,public B1public:A(int i,int j,int k,int m):B1(i),B2(j),bb(k)a=m;coutconstructor A.-mendl;void print()/没有该函数则产生二义性 B1:

13、print();B2:print();couta,bb.getb3()endl;private:int a;B3 bb;void main()A aa(1,2,3,4);aa.print();,构造函数的执行次序:(1)基类:依派生的次序决定(2)子对象的构造函数(3)派生类的构造函数,程序运行结果:constructor B2.-1constructor B1.-2constructor B3.-3constructor A.-4124,3,规则:(1)析构函数不能继承;(2)派生类中要定义自己的析构函数释放在派生中新增的成员;(3)从基类中继承的成员释放,可以通过基类的析构函数实现;(4)

14、激活析构函数的顺序与构造函数缴活顺序相反。,例、多重继承与析构函数的关系,#include class B1 public:B1(int i)coutconstructor B1-iendl;B1()coutdestructing B1endl;class B2 public:B2(int j)coutconstructor B2-jendl;B2()coutdestructing B2endl;class C:public B2,public B1 public:C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b)pri

15、vate:B1 memberB1;B2 memberB2;,void main()C(1,2,5,8);,小结:,(1)多重继承是一个类从多个基类派生。(2)必须在派生类名和冒号之后,列出所有基类的类名,基类间用逗号隔开。(3)派生类的构造函数必须激活所有基类的构造函数,并传送相应的参数。(4)继承/多重继承一般是公有继承。保护继承/私有继承只是在技术讨论较多,实际使用较少。,五、多继承中同名覆盖原则,当派生类与基类中有同名成员时:若未强行指名,则通过派生类对象使用的是派生类中的同名成员。如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定。,例 多继承同名覆盖举例,#include

16、 class B1/声明基类B1public:/外部接口int nV;void fun()coutMember of B1endl;class B2/声明基类B2 public:/外部接口int nV;void fun()coutMember of B2endl;class D1:public B1,public B2 public:int nV;/同名数据成员void fun()coutMember of D1endl;/同名函数成员;,void main()D1 d1;d1.nV=1;/对象名.成员名标识,访问D1类成员d1.fun();d1.B1:nV=2;/作用域分辨符标识,访问基类B

17、1成员d1.B1:fun();d1.B2:nV=3;/作用域分辨符标识,访问基类B2成员d1.B2:fun();,六、二义性问题,在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)采用虚函数或支配(同名覆盖)原则来解决。当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性采用虚基类来解决。,虚基类,虚基类的引入用于有共同基类的场合声明以virtual修饰说明基类例:class B1:virtual public B作用主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.为最远的派生类提供唯一的基类

18、成员,而不重复产生多次拷贝注意:在第一级继承时就要将共同基类设计为虚基类。,例 虚基类举例,#include class B0/声明基类B0public:/外部接口int nV;void fun()coutMember of B0endl;class B1:virtual public B0/B0为虚基类,派生B1类public:/新增外部接口int nV1;,class B2:virtual public B0/B0为虚基类派生B2类 public:/新增外部接口int nV2;class D1:public B1,public B2/派生类D1声明 public:/新增外部接口int nV

19、d;void fund()coutMember of D1endl;void main()/程序主函数 D1 d1;/声明D1类对象d1d1.nV=2;/使用直接基类d1.fun();,虚基类及其派生类构造函数,建立对象时所指定的类称为最远派生类。虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。在建立对象时,只有最远派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。,有虚基类

20、时的构造函数举例,#include class B0/声明基类B0 public:/外部接口B0(int n)nV=n;int nV;void fun()coutMember of B0endl;class B1:virtual public B0 public:B1(int a):B0(a)nv1=a;int nV1;class B2:virtual public B0 public:B2(int a):B0(a)nv2=a;int nV2;,class D1:public B1,public B2public:D1(int a):B0(a),B1(a),B2(a)int nVd;void

21、fund()coutMember of D1endl;void main()D1 d1;d1.nV=2;d1.fun();,八、赋值兼容原则,一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以被赋值给基类对象。派生类的对象可以初始化基类的引用。指向基类的指针也可以指向派生类。,例 赋值兼容规则举例,#include class B0/基类B0声明 public:void display()coutdisplay();/对象指针-成员名,void main()/主函数B0 b0;/声明B0类对象B1 b1;/声明B1类对象D1 d1;/声明D1类对象B0*p;/声明B0类指针p=,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号