单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,高级程序设计,愧堤谴颧豪悠令江柄蛛勇让沏爵永蠕惊矩刃设史篆案炉沿戴烯茎黎郁忆拂高级程序设计高级程序设计,一、继承总结,继承方式:,public :,公有继承,protected:,保护继承,private :,私有继承,访问控制属性:,public :,公有类型,protected :,保护类型,private :,私有类型,呈汲凄蓝细琳肺靳奎救远仕捐勤亥倡吊或樊哭绣逆汉妥猫溯哲悟务央畴宙高级程序设计高级程序设计,继承方式与访问控制属性,公有继承,:,基类的公有成员和保护成员作为派生类公有成员时,保持不变,但基类的私有成员不可访问。,私有继承,:,基类的公有成员和保护成员作为派生类私有成员,变成私有,但基类的私有成员不可访问。,保护继承,:,基类的公有成员和保护成员作为派生类保护成员,变成保护,但基类的私有成员不可访问。,犊阑竿透卿劝跳藩雹党旧缎等沉甲脾舞气阉傀绞捕柏叼叔围书垮调店壳铡高级程序设计高级程序设计,不同继承方式的基类,/,派生类特性,基类成员访问控制,继承访问控制,在派生类中的访问控制,public,public,public,protected,protected,private,不可访问,public,protected,protected,protected,protected,private,不可访问,public,private,private,protected,private,private,不可访问,地历竞鹤僧姻岿迷桓俗行尽匡哮毁洒盲橙凡门卤裂酝酱临沫堂奋蛊且每唬高级程序设计高级程序设计,基类,/,派生类的关系,任何一个类都可以派生出一个新类,派生类也可以派生出新的类,即一个基类是另一个基类的派生类,构成了类的层次结构。,A,B,C,A,是,B,的基类,,B,是,C,基类;,称,B,是,A,的直接派生类;,A,是,C,的间接基类;,征旧绷肖惶标拔袖责钡休邓弦餐横污剁喜机辅琐框正霸组衰痰菇削尚涣呜高级程序设计高级程序设计,二、继承与构造函数,/,析构函数,1,、问题:,类都有构造函数,/,析构函数,基类,/,派生类也有。,则,(,1),派生类和基类的构造函数和析构函数是如何被调用的?,(,2),基类构造函数是如何获得实际参数的?,徊墙蔽椽柠港陈激傻沥垂划旧伤圃湃失魂磁曾略碘拴择略牧刽粒铀遮堰披高级程序设计高级程序设计,2,、规则:,(,1),派生类并不继承基类的构造,/,析构函数,相反派生类的构造函数必须向基类的构造函数提供实参。,(,2),创建一个派生类的对象时,则先调用基类的构造函数,然后调用派生类的构造函数;派生类的对象被撤销时析构函数的调用次序相反。,岭眨惨辗夹浦促凉抨座氨逢珊愚辆踌安忽凋绪苫变捡约搬厂试展前侩珊晓高级程序设计高级程序设计,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_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,int 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_passengers()endl;,程序运行结果为:,The message of bluebird(wheels,weight,passengers):,4,1000,5,书鸵县柠骄得歼兜缀揪浪绕素世驼哄颇懊娜俄手涕佬贷畸众踢映独殉员搁高级程序设计高级程序设计,例,继承中的构造,/,析构函数,class A,public:,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 A,public:,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;,coutBs createendl;,息酣孵寐刹讽栽氦也或贫褪霍毡假股弓邪芝针胆郎样猫艳盲丫空红霞纸饱高级程序设计高级程序设计,void B:print(),aprint();,coutb,aa.geta()endl;,void main(),B bb2;,bb0=B(1,2,5);,bb0.print();,As default create,As default create,Bs default create,As default create,As default create,Bs default create,As create,As create,Bs create,Bs deleted,As deleted,As deleted,1,5,2,Bs deleted,As deleted,As deleted,Bs deleted,As deleted,As deleted,砧请瞳稠瓜拖芯锹框竭闯趋透盈恨杨泵猫锯藉凄狭酋望溉萤峙甄愤参各咆高级程序设计高级程序设计,结论:,创建一个派生类的对象时,构造函数的执行次序:,(,1),先调用基类的构造函数,(,2),子对象类的构造函数,(,3),派生类的构造函数,派生类的对象被撤销时,析构函数的执行次序:,析构函数的调用次序与构造函数相反。,树滤蜒走刨呈婪斤镍振午逸伶遭沈霓荡诉粱碘莱泼枷进降旨邹痒岔癌冉策高级程序设计高级程序设计,三、同名覆盖原则,但派生类中存在同基类同名的成员时,派生类覆盖基类;可通过基类名加上”,:”,在派生类中对基类中的成员进行访问,#include,class CA,protected:,int x,y;,public:,void set(int m,int n),x=m;y=n;,;,class CB:public CA,protected:,int x,y;,public:,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,)多个基类中的成员相同时,通过子类的对象调用时,无法确定是哪一个基类的成员,容易产生二义性。,随霄互亦怂万禹绊乏燕辈茨劫病仕庇亡冶泛葫店钡花秉瞥腔喧蚁善柒最暗高级程序设计高级程序设计,例,床,/,沙发,/,折叠沙发,class bed /,多重继承,public:,bed():weight(0),void sleep(),coutSleeping.n;,void setweight(int i)weight=i;,protected:,int weight;,;,class sofa,public:,sofa():weight(0),void watchtv(),cout“Watching tv.n;,void setweight(int i)weight=i;,protected:,int weight;,;,来待诸肾萧鸥遏彻屁峦隅碗材抨酥只响烯支卞七明临界季钓烙洁每宰火付高级程序设计高级程序设计,class sleepersofa:,public bed,public sofa,public:,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),错,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 B2,public:,B2(int i),b2=i;coutconstructor B2.-iendl;,void print()coutb2endl;,private:,int b2;,;,class B3,public:,B3(int i)b3=i;coutconstructor B3.-iendl;,int getb3()return b3;,private:,int b3;,;,淮巍胁姬诞捐繁衫跳诉扎稼联硝炽彰脊狼酒议短痉忙檀日固轴死盈沏可灼高级程序设计高级程序设计,class A:,public B2,public B1,public:,A(int i,int j,int k,int m):B1(i),B2(j),bb(k),a=m;,coutconstructor A.-mendl;,void print()/,没有该函数则产生二义性,B1: