《高级程序设计.PPT》由会员分享,可在线阅读,更多相关《高级程序设计.PPT(39页珍藏版)》请在优知文库上搜索。
1、高级程序设计高级程序设计一、继承总结一、继承总结 继承方式:继承方式:public :公有继承公有继承 protected:保护继承保护继承 private :私有继承私有继承访问控制属性:访问控制属性:public :公有类型公有类型 protected :保护类型保护类型 private :私有类型私有类型继承方式与访问控制属性继承方式与访问控制属性:基类的公有成员和保护成员作为派生类公有成员时,保持不变,但基类的公有成员和保护成员作为派生类公有成员时,保持不变,但基类的私有成员不可访问。基类的私有成员不可访问。:基类的公有成员和保护成员作为派生类私有成员,变成私有,但基基类的公有成员和保
2、护成员作为派生类私有成员,变成私有,但基类的私有成员不可访问。类的私有成员不可访问。:基类的公有成员和保护成员作为派生类保护成员,变成保护,但基基类的公有成员和保护成员作为派生类保护成员,变成保护,但基类的私有成员不可访问。类的私有成员不可访问。不同继承方式的基类不同继承方式的基类/派生类特性派生类特性基类成员访问控制基类成员访问控制继承访问控制继承访问控制在派生类中的访问控制在派生类中的访问控制publicpublicpublicprotectedprotectedprivate不可访问不可访问publicprotectedprotectedprotectedprotectedprivate
3、不可访问不可访问publicprivateprivateprotectedprivateprivate不可访问不可访问基类基类/派生类的关系派生类的关系 任何一个类都可以派生出一个新类,派生类也可以派生出新任何一个类都可以派生出一个新类,派生类也可以派生出新的类,即一个基类是另一个基类的派生类,构成了类的层次结构。的类,即一个基类是另一个基类的派生类,构成了类的层次结构。ABCA 是是 B 的基类,的基类,B 是是 C 基类;基类;称称 B 是是 A 的直接派生类;的直接派生类;A 是是 C 的间接基类;的间接基类;二二、继承与构造函数、继承与构造函数/析构函数析构函数1、问题:、问题:类都有
4、构造函数类都有构造函数/析构函数,基类析构函数,基类/派生类也有。派生类也有。则则(1)派生类和基类的构造函数和析构函数是如何被调用的?派生类和基类的构造函数和析构函数是如何被调用的?(2)基类构造函数是如何获得实际参数的?基类构造函数是如何获得实际参数的?2、规则:、规则:(1)派生类并不继承基类的构造派生类并不继承基类的构造/析构函数,相反派生类的构造函数必析构函数,相反派生类的构造函数必须向基类的构造函数提供实参。须向基类的构造函数提供实参。(2)创建一个派生类的对象时,则先调用基类的构造函数,然后调用派创建一个派生类的对象时,则先调用基类的构造函数,然后调用派生类的构造函数;派生类的对
5、象被撤销时析构函数的调用次序相反。生类的构造函数;派生类的对象被撤销时析构函数的调用次序相反。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;pub
6、lic:/公有函数成员公有函数成员 vehicle(int in_wheels,float in_weight)wheels=in_wheels;weight=in_weight;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,i
7、nt people=5):vehicle(in_wheels,in_weight)passenger_load=people;int get_passengers()return passenger_load;void main()car bluebird(4,1000);/声明声明car类的对象类的对象 coutThe message of bluebird(wheels,weight,passengers):endl;coutbluebird.get_wheels(),/输出小汽车的信息输出小汽车的信息 bluebird.get_weight(),bluebird.get_passenge
8、rs()endl;程序运行结果为:程序运行结果为:The message of bluebird(wheels,weight,passengers):4,1000,5例,继承中的构造例,继承中的构造/析构函数析构函数class Apublic:A()a=0;coutAs default 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 def
9、ault 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;coutBs 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
10、 default createAs default createBs default createAs createAs createBs createBs deletedAs deletedAs deleted1,5,2Bs deletedAs deletedAs deletedBs deletedAs deletedAs deleted结论:结论:创建一个派生类的对象时,构造函数的执行次序:创建一个派生类的对象时,构造函数的执行次序:(1)先调用基类的构造函数先调用基类的构造函数(2)子对象类的构造函数子对象类的构造函数(3)派生类的构造函数派生类的构造函数派生类的对象被撤销时,析构函数的
11、执行次序:派生类的对象被撤销时,析构函数的执行次序:析构函数的调用次序与构造函数相反。析构函数的调用次序与构造函数相反。三、同名覆盖原则三、同名覆盖原则但派生类中存在同基类同名的成员时,派生类覆但派生类中存在同基类同名的成员时,派生类覆盖基类;可通过基类名加上盖基类;可通过基类名加上”:”在派生类中对基类中在派生类中对基类中的成员进行访问的成员进行访问#includeclass CAprotected:int x,y;public:void set(int m,int n)x=m;y=n;class CB:public CAprotected:int x,y;public:void set(i
12、nt 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)派生类与每个
13、类之间的关系仍可看作是一个单继承。)派生类与每个类之间的关系仍可看作是一个单继承。(2)多个基类中的成员相同时,通过子类的对象调用时,无法确定)多个基类中的成员相同时,通过子类的对象调用时,无法确定是哪一个基类的成员,容易产生二义性。是哪一个基类的成员,容易产生二义性。例,例,床床/沙发沙发/折叠沙发折叠沙发class bed /多重继承多重继承public:bed():weight(0)void sleep()coutSleeping.n;void setweight(int i)weight=i;protected:int weight;class sofapublic:sofa():we
14、ight(0)void watchtv()cout“Watching tv.n;void setweight(int i)weight=i;protected:int weight;class sleepersofa:public bed,public sofapublic:sleepersofa()void foldout()coutFold out the sofa.n;void main()sleepersofa ss;ss.watchtv();ss.foldout();ss.sleep();ss.sofa:setweight(90);/ss.setweight(90)错错watchin
15、g 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(int i)b2=i;coutconstructor B2.-iendl;void print()coutb2endl;private:int b2;class B3public:B3(int i)b3=i;coutconstructor B3.-iendl
16、;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: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)派生类中要定义自己的析构函数释放在派