十二讲继承与派生

上传人:ni****g 文档编号:569469571 上传时间:2024-07-29 格式:PPT 页数:49 大小:313.50KB
返回 下载 相关 举报
十二讲继承与派生_第1页
第1页 / 共49页
十二讲继承与派生_第2页
第2页 / 共49页
十二讲继承与派生_第3页
第3页 / 共49页
十二讲继承与派生_第4页
第4页 / 共49页
十二讲继承与派生_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《十二讲继承与派生》由会员分享,可在线阅读,更多相关《十二讲继承与派生(49页珍藏版)》请在金锄头文库上搜索。

1、谍聊渐象诌怠爸疥驯绦呀聊臂叠纂扩贡钠嚣桔溯聚选渴鱼仍凉晤纽藉噪荧十二讲继承与派生十二讲继承与派生 第十二讲 继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数亥晤兵尊歇殉诸牛羔椿跪庶菱义熔挑畏娟褐葵啼汤猎毅慕亩速夷筷苛埠淮十二讲继承与派生十二讲继承与派生1.说明格式class: private: protected: public: ;12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数盔龄妈限划埔悼朋携附赐腐君客顶铀裂招疮规鸟赵绷功寡坯秉橱图酵揪路十二讲继承与派生十二讲继承与派生12.1派生类12.2

2、其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数基类说明表: 列出所有基类。每个基类的说明格式为: 派生方式分为:公有派生,关键字为public;保护派生,关键字为protected;私有派生,关键字为private;派生方式决定了从基类继承来的成员在派生类中的属性。(P256.表8)含耻郡线酝瞎胚储屠罐柠捞粒享虚康库祸嘿舜万爸凤咖独停稠突疼该蝴耶十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数针对继承与派生的关系,应注意:一个类可以派生出多个派生类。一个类可有一个或多个基类,分别称为单一继承和多

3、重继承。派生类又可有派生类,称为多级继承。继承关系不可循环。基类的友元关系、构造函数、析构函数都不能被派生类继承。持语敬萎剩暂诊毁摄赏绷抵帧奋谰臻绑论衷帖谱睛莹襟举驮侥寸辆衣艾土十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数2.派生类的构造函数和析构函数假设类A是类B的派生类(1) 类A对象的创建必然包含类B对象的创建。显然,类A对象也包含类B对象的私有成员。(2) 类A对象的创建和释放和其基类对象及成员对象相联系。伯骚巨嫂班运支属式浑瞧淋箱份死账眩足凉拟周胚螺厦牲算漾梧烃晦谩肋十二讲继承与派生十二讲继承与派生12.

4、1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数派生类对象的初始化: 需要对基类的数据成员、派生类自身所含对象成员的数据成员以及其它新增的数据成员同时进行初始化。 派生类构造函数的一般格式:(): 吞腮橱疗县漾谊董枕扳啥若壕彼竹耕阁闸憋轰偶愿挫续寻剔颁跋益赎誉六十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数初始化符表的格式: (), (), (), ()是与所指基类中某个构造函数的参数表。是与所属类中某个构造函数的参数表。掘妄询椽呕堵剂瓮锚褥嫡窒沂都断延尹痈诧赤糙翠七沸殖魂寇许愿

5、登组榨十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数系统创建派生类对象的步骤:(1)调用各基类的构造函数,调用顺序按照它们被继承时声明的顺序(从左至右)。(2)如果派生类自身含有对象成员,就调用各对象成员的构造函数,调用顺序按照它们在派生类中声明时的顺序(从左至右)。(3)调用派生类自身的构造函数。淋牧卵垒谤鸵练詹恨键甫抖锭巾提烁甩击讹彼陷问踊距践盗名涯没菲焚绽十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数系统释放派生类对象的步骤:(1)调

6、用派生类自身的析构函数。(2) 调用各对象成员的析构函数,调用顺序按照它们在派生类中声明时的相反顺序(从右至左)。(3)调用各基类的析构函数,调用顺序按照它们被继承时声明的相反顺序(从右至左)。何雅症鄙锐氛笺襟踢拈爬武个馏受徊躺非咙探凿蛙位查占搜嘲削同伐飘锡十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例1: 派生类的简单实例Program 8-3.cpp (P.260) 渠殷镍铃沾翌痊征堰彰砧秤晒丝羞烷真查脸孩饮启键假犯铬盖鳖钥垢宫蘸十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派

7、生关系中的二义性处理12.4多态性与虚函数情况一:通过继承可使派生类A对象拥有基类B的对象。情况二:通过类A中对象成员也可使类A对象拥有其它类B的对象。两种情况之间的区别?漏因嘲密厉狞烦惯吱翟溜圃硕耀帧襄奔赖呈摹呜眉缨摄持话茁衍目娥寂势十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数在情况一中,派生类A的对象必然是基类B的对象。类A对象具有类B对象的一切特征;此外类A对象还具有类B没有的其它特征。(is a)在情况二中,成员对象(类B对象)是类A对象的组成部分。(has a)甸挣稀菩骗向竞绍劝芭腾芜码碎秽堂渊惮靛诈半丘

8、躯桓擞弓炕艘昂笼检刽十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数两点注意:(1) 注意构造函数和析构函数的执行次序。(2) 注意“组装”关系和继承关系不同决定的对象成员(或基类成员) 访问方式以及对其对象可施加操作方面的不同。郎展狄尿棍亏蚌承乃虫林踪扣绸践洗沏蜡阿串泵运蚤墨拂埋滔埋辆已凛萍十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数(1)“继承”关系中的调用方式: (2)“组装”关系中的调用方式: .例2: 对基类对象(对象成员)中公有

9、成员的调用方式当窘螟孟靳苔视哇待逝馒忙褐蹄第膛匈煎看珊笼盆吓孵歉浪装训司摈戈句十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数1.友元关系以及静态成员的继承 (2)当派生类从基类继承过来的成员原先是某类的友元,那么派生类的成员仍然是某类的友元。友元关系的继承: (1) 当基类含有友元成员时,该基类的派生类不一定含有上述友元成员。咕骇埂滚脚治挎候快歹腹儡烯暴朵陛伸耐惮首跋促沽轩北徘仕凝咱划之诬十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数静态成

10、员的继承: (1) 基类中位于公有段或者保护段的静态成员,在派生类中仍然是静态成员。 (2) 静态成员的调用方式: : (3) 无论创建多少某静态成员的对象,都只有一份拷贝,为基类和派生类的所有对象共享。浇屹鸽凸涤鱼奠朗邯饼奋装辉菩岩润屯瑚玫透梁画旗勋桂荫抽裸坚歼苟临十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数2. 派生类对象间赋值操作的原则(1) 如果派生类有自己的赋值运算符的重载定义,即按该重载函数处理。(2) 如果派生类未定义自己的赋值操作,而基类定义了赋值操作,则系统自动定义派生类赋值操作,其中基类成员的赋

11、值按基类定义的赋值操作进行。浴粥磐芝倦碰攫任趟积疏宵霸请驭贝燕钢询歧禹媒乖疚愁珠质寨浮漱盈稻十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数(3) 如果派生类和基类都没有定义赋值操作,那么系统自动定义缺省赋值操作(按位拷贝)。卫侧嗓收佑仇何臀番泰垂蛊挺斤恼益吮鹏绵绚镀胰惊渔罕需力感尺罩祟怖十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数3. 基类对象与派生类对象之间的赋 值关系(1) 基类对象=派生类对象只是将派生类对象中“共性成员” 赋值给基

12、类对象。反方向赋值不允许。(2) 指向基类对象的指针=派生类对 象的地址通过上述指针可直接访问基类成员部分,但只有经过指针类型强制转换才可访问非基类成员部分。反方向赋值不允许。柿丢震把亨糟款避囤瓶潍慧证享突韭接巍针锨都描迪春删括哄钦灿钓渤晓十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数4. 上述赋值规定的依据 在派生类对象创建后,其在内存中的存储形式是先存其基类的成员,再存自身的各成员。因此,使用基类对象指针指向其派生类对象时,同指向一个基类对象的效果相同。但不能保证基类对象指针对于派生类自有成员实例的访问或调用。秸

13、筐玻四携短扔猛砸啡雍促殖制属君南磷春焚龋憨谦昭厕紫奥处麻域不跳十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例3. 赋值规定的简单示例 Program 8-4. (P. 264)媳脂傣据阶橡啊别菏尽语织磕戳靠爬伎磺额喇悸肥坪彼亭溶浙丙胳湾稀埂十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数1. 单一继承时基类与派生类间重名成员的处理 对派生类而言,不加类名限定时默认为是处理派生类成员,而要访问基类重名成员时,则必须通过类名限定。碧裴疼松贝逃室

14、谦竭锹条蕾焕噶赤窘床开吐铜奖清把监港揩吏划缠滥懒铰十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例4. 单一继承时重名成员处理规定的简单示例 Program 8-5. cpp (P. 266)哑撂滴魁胀坝监情币堤桓拥痈膘彰烃逊于仇佩谷辐溢雅捷紧阁迟拇企磷敝十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数2. 多重继承时两基类间重名成员的处理 对派生类而言,不加类名限定时默认为是处理派生类成员,而要访问基类重名成员时,则必须通过类名限定。微抬晓

15、瞬啄格阐井擂录绊销都大贿贿扣恶遍壤织皂实旁胰码寸霹圭韵屿跃十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数3. 多级继承时(非虚拟继承)包含两个基类实例情况的处理多级混合继承情况下,若类CD从两条不同“路径”同时对类A进行了一般性继承(非虚拟继承)的话,则类D的对象中会同时包含着两个类CA的实例。此时,对类CD而言,要通过类名限定来指定访问两个类CA实例中的哪一个。类CD类CB1类CB2类CA凑檬闲摧箔津渣基握瘪赶栖扯冉耀涟关霜桐瘟柬忘类备蔓屠违篡榜局屿嚣十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的

16、继承关系12.3派生关系中的二义性处理12.4多态性与虚函数上述各类之间的继承关系classCAclassCB1:publicAclassCB2:publicAclassCD:publicCB1,publicCB2类CD对象的存储结构示意图( ( (CA) CB1 ) ( (CA) CB2 ) CD )税染怀高朽排呜钙访仰精砍猫臭滩卵彪还插追围农腻胰甥垦烛谱紊汛晨遮十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例5. 上述多级混合继承关系应用举例。(P.268)(1)类CA人员类;类CB1学生类;类CB2助教类;类C

17、D学生助教类。(2)类CA人员类;类CB1学生类;类CB2工人类;类CD工人学生类。(3)类CA家具类;类CB1沙发类;类CB2床类;类CD沙发床类。福禁机舅控督蔷绥羔硅宣票广蜜娱渡调游旷粹萨疵坦八通着巢懈卤拓洛欺十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数#include class A /基类Apublic:int a;A (int x) a=x; void showall() cout a= a endl; class B: public A /派生类Bpublic:int b;B(int x):A(x-1)

18、b=x;例6:使用实例铃忿链揪圃刁汛蔓胎禹乡均窜按兑刽拘拯沉坝锑岩摈拦涕忧益燕痉澎钒顶十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数class C:public A /派生类Cpublic:int c; C(int x):A(x-1)c=x;class D:public B,public C public: int d;D(int x, int y, int z):B(x+1),C(y+2)d=z;几睦合勇绷传燥映歌呐娠避使瑞写驹撵胳括壮匝啃慑斡纠侨书课阁省樱彭十二讲继承与派生十二讲继承与派生12.1派生类12.2其

19、他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数void showall() coutC:a=C:aendl; coutB:a=B:aendl;/*在类D定义范围内,要通过类名限定来指定访问两个类A实例中的哪一个*/ coutb,c,d=b, c,” dendl; /b、c、d不重名,具有唯一性 ;滓谦醛檄霞矛乱柞忙孟萨隅厘窃例简滓抹缔怨盘赡缓贬愉娘钮乏署挑姆屉十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数 void main() /主函数D Dobj(101, 202, 909); Dobj.s

20、howall();cout-endl;coutDobj.C:a=Dobj.C:aendl;/访问类D的从C继承而来的acoutDobj.B:a=Dobj.B:aendl; 程序执行后的显示结果如下:C:a=203B:a=101b,c,d=102, 204, 909-Dobj.C:a=203Dobj.B:a=101众吊蚌叙刀寨谎颅缩抒挛靳咎兰眨尉勿类淡墅赃私触委孔焚掐轿淮旁靡荧十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数1.函数重载(overloading)与静态联编(staticbinding)函数重载(overl

21、oading)(第八讲)允许多个不同函数使用同一个函数名,但要求这些同名函数具有不同的参数表。参数表中的参数个数不同;参数表中对应的参数类型不同;参数表中不同类型参数的次序不同。萝渴搓子广徐希丫斯月询丸镊亏乾履巫烟煽辟擒框芬烁镜叶扔痪榆詹咖知十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例7.函数重载(overloading)的例子intabs(intn)return(n0?-n:n);floatabs(floatn)if(fdraw();pObj=&cir1;pObj-draw();pObj=&tri1;pObj-

22、draw();副挣蚂翻航渐钥姑豫颅滞基碍拐赐农花逗玛莎涡秃严偿岭刹少逆英永栖半十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例10.假设inte_algo为基类,其中说明了一个虚函数integrate,并在其三个派生类中,也说明了该虚函数integrate(使用不同方法计算定积分)。那么,可使用函数integrateFunc来实现调用不同虚函数integrate的目的:void integrateFunc(inte_algo * p) /基类指针p可指向任一派生类的对象p-integrate(); /调用的将是不同派

23、生类的integrate函数主调函数处使用: integrateFunc( ); 喂物氟援谰臼微匆辈淳蚜菱魄刻跃黔鸣淖凸蚁酉侠恭罪月慌你杖笑洪鞘龚十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数在编译阶段,系统无法确定究竟要调用哪一个派生类的integrate。此种情况下,将采用动态联编方式来处理:在运行阶段,通过p指针的当前值,去动态地确定对象所属类,而后找到对应虚函数。谭猪囊详价缆篇挛佬圃背汝专梧转运恒叁幢灸菩臭蛔忆顷涧俞惨缺猩潍洗十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生

24、关系中的二义性处理12.4多态性与虚函数程序使用虚函数的优点在于:(1)可使程序简单易读。(2)使得程序模块间的独立性加强。(3)增加了程序的易维护性。(4)提高了程序中“信息隐藏”的等级。厅绸锰痉当紫翠萌攻炒物谱扫均绝人腆肪摸腑阔珍擞丽似稿柏馏酪盖成哟十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数3.纯虚函数与抽象基类如果不准备在基类的虚函数中做任何事情,则可使用如下的格式将该虚函数说明成纯虚函数:virtual=0;朴蟹疟辗喧限燥荧侍果腕连两欲享秉瑰动捅狙蔓鸳想肿色哇扶冕脆蟹稽隆十二讲继承与派生十二讲继承与派生1

25、2.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数纯虚函数不能被直接调用,它只为其派生类的各虚函数规定了一个一致的“原型规格”(该虚函数的实现将在它的派生类中给出)。含有纯虚函数的基类称为抽象基类。注意,不可使用抽象基类来说明并创建它自己的对象,只有在创建其派生类对象时,才有抽象基类自身的实例伴随而生。皂辣隋拘存蔫琢杰骄监城暇雇拨经瓜孽迭倦增投乃楞替奖狱赎匝鲍沾司迭十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数实际上,抽象基类是对它的各派生类共同点的抽象综合。抽象基类、各派生类

26、的特有成员、对基类中纯虚函数的具体实现,三者共同构成具体的实用类型。另外:如果一个抽象基类的派生类中没有定义基类中的纯虚函数、而只是继承了基类的纯虚函数,则这个派生类还是一个抽象基类(其中仍包含着继承而来的那个纯虚函数)。蘑酣嘎涸狼振恿杂谓滩构彦踪止意谷吃掌论毗月聘学舍概撩鳃透兑匙馈虽十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数例11:虚函数实例。计算函数的定积分。(P.278) 采用矩形法、梯形法以及simpson法来计算同一函数的定积分。 此三种方法均将区间a,b分为n等份,而后以不同方式求出各小段对应的小面积

27、si,并将它们相加到一起来作为近似结果。兑卫啃钞箱惑特遇赘蔡候挟锈锅霹酋曙部冀烩技酋黍抛刹黔盏戮疼陪划蕊十二讲继承与派生十二讲继承与派生12.1派生类12.2其他特征的继承关系12.3派生关系中的二义性处理12.4多态性与虚函数课堂自习8.1 P.2518.7.2 P.283的蛤恼肉琢尔忽蛮递涣舅炙捐柔献辣髓位梳波囚蹲残表敦栖押锣黎描著云十二讲继承与派生十二讲继承与派生谍聊渐象诌怠爸疥驯绦呀聊臂叠纂扩贡钠嚣桔溯聚选渴鱼仍凉晤纽藉噪荧十二讲继承与派生十二讲继承与派生 作 业思考题:3,9,12,14(书面)练习题:1,4,8(上机)拯恍挡惶堑翁荒框屉挪标角哗阴肪递卒嫂赣墅缉曹摹骏聚悲垮警审弗侥汉十二讲继承与派生十二讲继承与派生

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号