欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    继承与派生精选文档.ppt

    • 资源ID:44701976       资源大小:2.92MB        全文页数:76页
    • 资源格式: PPT        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    继承与派生精选文档.ppt

    继承与派生本讲稿第一页,共七十六页本章主要内容o类的继承与派生o类成员的访问控制o单继承与多继承o派生类的构造、析构函数o类成员的标识与访问本讲稿第二页,共七十六页7.1继承概述o什么是继承o基类与派生类本讲稿第三页,共七十六页类的继承与派生o保持已有类的特性而构造新类的过程称为继承。o在已有类的基础上新增自己的特性而产生新类的过程称为派生。o被继承的已有类称为基类(或父类)。o派生出的新类称为派生类。本讲稿第四页,共七十六页动物哺乳动物爬行动物马狗工作型狗牧羊犬宠物狗看家犬猎犬小哈吧狗波斯狗本讲稿第五页,共七十六页1.什么是继承o简单地说,“继承”是指某类事物具有比其父辈事物更一般性的某些特征(或称为属性),用对象和类的术语,我们可以这样表达:对象和类“继承”了另一个类的一组属性。本讲稿第六页,共七十六页2.基类与派生类o可以将上图中的各个方块看作是一个类,因此,例子中所涉及的这些类之间构成了一幅清晰的层次结构,既有类称为基类,以它为基础建立的新类称为派生类。本讲稿第七页,共七十六页7.2使用继承继承的一般形式如下:class派生类:访问权限基类访问权限是访问控制说明符,它可以是public、private或protected。本讲稿第八页,共七十六页继承与派生的目的o继承的目的:实现代码重用。o派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。本讲稿第九页,共七十六页派生类的声明class派生类名:继承方式基类名成员声明;本讲稿第十页,共七十六页继承方式o不同继承方式的影响主要体现在:n派生类成员成员对基类成员的访问权限n通过派生类对象对象对基类成员的访问权限o三种继承方式n公有继承n私有继承n保护继承本讲稿第十一页,共七十六页范例o继承应用的例子1创建派生类对象并进行初始化,在主程序中通过继承基类的成员属性,即可将三维对象的坐标值进行输出。o继承应用的例子2在主程序中创建派生类对象b,对象b调用基类的公有成员函数传递参数,然后对象b再调用自己的成员函数进行输出。本讲稿第十二页,共七十六页范例o继承应用的例子1创建派生类对象并进行初始化,在主程序中通过继承基类的成员属性,即可将三维对象的坐标值进行输出。o继承应用的例子2在主程序中创建派生类对象b,对象b调用基类的公有成员函数传递参数,然后对象b再调用自己的成员函数进行输出。本讲稿第十三页,共七十六页公有继承(public)o基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。o派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。o通过派生类的对象只能访问基类的public成员。类成员的访问控制本讲稿第十四页,共七十六页例7-1公有继承举例classPoint/基类Point类的声明public:/公有函数成员voidInitP(floatxx=0,floatyy=0)X=xx;Y=yy;voidMove(floatxOff,floatyOff)X+=xOff;Y+=yOff;floatGetX()returnX;floatGetY()returnY;private:/私有数据成员floatX,Y;类成员的访问控制本讲稿第十五页,共七十六页classRectangle:publicPoint/派生类声明public:/新增公有函数成员voidInitR(floatx,floaty,floatw,floath)InitP(x,y);W=w;H=h;/调用基类公有成员函数floatGetH()returnH;floatGetW()returnW;private:/新增私有数据成员floatW,H;16本讲稿第十六页,共七十六页#include#includeusingnamecpacestd;intmain()Rectanglerect;rect.InitR(2,3,20,10);/通过派生类对象访问基类公有成员rect.Move(3,2);coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;return0;17本讲稿第十七页,共七十六页私有继承(private)o基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。o派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。o通过派生类的对象不能直接访问基类中的任何成员。类成员的访问控制本讲稿第十八页,共七十六页例7-2私有继承举例classRectangle:privatePoint/派生类声明public:/新增外部接口voidInitR(floatx,floaty,floatw,floath)InitP(x,y);W=w;H=h;/访问基类公有成员voidMove(floatxOff,floatyOff)Point:Move(xOff,yOff);floatGetX()returnPoint:GetX();floatGetY()returnPoint:GetY();floatGetH()returnH;floatGetW()returnW;private:/新增私有数据floatW,H;类成员的访问控制本讲稿第十九页,共七十六页#include#includeusingnamecpacestd;intmain()/通过派生类对象只能访问本类成员Rectanglerect;rect.InitR(2,3,20,10);rect.Move(3,2);coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;return0;20本讲稿第二十页,共七十六页保护继承(protected)o基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。o派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。o通过派生类的对象不能直接访问基类中的任何成员类成员的访问控制本讲稿第二十一页,共七十六页protected成员的特点与作用o对建立其所在类对象的模块来说,它与private成员的性质相同。o对于其派生类来说,它与public成员的性质相同。o既实现了数据隐藏,又方便继承,实现代码重用。类成员的访问控制本讲稿第二十二页,共七十六页例7-3protected成员举例classAprotected:intx;intmain()Aa;a.x=5;/错误类成员的访问控制本讲稿第二十三页,共七十六页classAprotected:intx;classB:publicApublic:voidFunction();voidB:Function()x=5;/正确24本讲稿第二十四页,共七十六页类型兼容规则o一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:n派生类的对象可以被赋值给基类对象。n派生类的对象可以初始化基类的引用。n指向基类的指针也可以指向派生类。o通过基类对象名、指针只能使用从基类继承的成员类型兼容本讲稿第二十五页,共七十六页例7-4类型兼容规则举例#includeusingnamecpacestd;classB0/基类B0声明public:voiddisplay()coutB0:display()endl;/公有成员函数;类型兼容本讲稿第二十六页,共七十六页classB1:publicB0public:voiddisplay()coutB1:display()endl;classD1:publicB1public:voiddisplay()coutD1:display()display();/对象指针-成员名27本讲稿第二十七页,共七十六页intmain()/主函数B0b0;/声明B0类对象B1b1;/声明B1类对象D1d1;/声明D1类对象B0*p;/声明B0类指针p=&b0;/B0类指针指向B0类对象fun(p);p=&b1;/B0类指针指向B1类对象fun(p);p=&d1;/B0类指针指向D1类对象fun(p);运行结果:B0:display()B0:display()B0:display()28本讲稿第二十八页,共七十六页基类与派生类的对应关系o单继承n派生类只从一个基类派生。o多继承n派生类从多个基类派生。o多重派生n由一个基类派生出多个不同的派生类。o多层派生n派生类又作为基类,继续派生新的类。单继承与多继承本讲稿第二十九页,共七十六页多继承时派生类的声明class派生类名:继承方式1基类名1,继承方式2基类名2,.成员声明;注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。单继承与多继承本讲稿第三十页,共七十六页多继承举例classApublic:voidsetA(int);voidshowA();private:inta;classBpublic:voidsetB(int);voidshowB();private:intb;classC:publicA,privateBpublic:voidsetC(int,int,int);voidshowC();private:intc;单继承与多继承本讲稿第三十一页,共七十六页voidA:setA(intx)a=x;voidB:setB(intx)b=x;voidC:setC(intx,inty,intz)/派生类成员直接访问基类的/公有成员setA(x);setB(y);c=z;/其它函数实现略intmain()Cobj;obj.setA(5);obj.showA();obj.setC(6,7,9);obj.showC();/obj.setB(6);错误/obj.showB();错误return0;32本讲稿第三十二页,共七十六页继承时的构造函数o基类的构造函数不被继承,派生类中需要声明自己的构造函数。o声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。o派生类的构造函数需要给基类的构造函数传递参数派生类的构造、析构函数本讲稿第三十三页,共七十六页单一继承时的构造函数派生类名:派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表)本类成员初始化赋值语句;派生类的构造、析构函数本讲稿第三十四页,共七十六页单一继承时的构造函数举例#includeusingnamecpacestd;classBpublic:B();B(inti);B();voidPrint()const;private:intb;派生类的构造、析构函数本讲稿第三十五页,共七十六页B:B()b=0;coutBsdefaultconstructorcalled.endl;B:B(inti)b=i;coutBsconstructorcalled.endl;B:B()coutBsdestructorcalled.endl;voidB:Print()constcoutbendl;36本讲稿第三十六页,共七十六页classC:publicBpublic:C();C(inti,intj);C();voidPrint()const;private:intc;37本讲稿第三十七页,共七十六页C:C()c=0;coutCsdefaultconstructorcalled.endl;C:C(inti,intj):B(i)c=j;coutCsconstructorcalled.endl;C:C()coutCsdestructorcalled.endl;voidC:Print()constB:Print();coutcendl;intmain()Cobj(5,6);obj.Print();38本讲稿第三十八页,共七十六页多继承时的构造函数派生类名:派生类名(基类1形参,基类2形参,.基类n形参,本类形参):基类名1(参数),基类名2(参数),.基类名n(参数)本类成员初始化赋值语句;派生类的构造、析构函数本讲稿第三十九页,共七十六页派生类与基类的构造函数o当基类中声明有默认形式的构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数。o若基类中未声明构造函数,派生类中也可以不声明,全采用缺省形式构造函数。o当基类声明有带形参的构造函数时,派生类也应声明带形参的构造函数,并将参数传递给基类构造函数。派生类的构造、析构函数本讲稿第四十页,共七十六页多继承且有内嵌对象时的构造函数派生类名:派生类名(基类1形参,基类2形参,.基类n形参,本类形参):基类名1(参数),基类名2(参数),.基类名n(参数),对象数据成员的初始化本类成员初始化赋值语句;派生类的构造、析构函数本讲稿第四十一页,共七十六页构造函数的调用次序1调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。2调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。3派生类的构造函数体中的内容。派生类的构造、析构函数本讲稿第四十二页,共七十六页拷贝构造函数o若建立派生类对象时调用缺省拷贝构造函数,则编译器将自动调用基类的缺省拷贝构造函数。o若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数。例如:C:C(C&c1):B(c1)派生类的构造、析构函数本讲稿第四十三页,共七十六页例7-5派生类构造函数举例#includeusingnamecpacestd;classB1/基类B1,构造函数有参数public:B1(inti)coutconstructingB1iendl;classB2/基类B2,构造函数有参数public:B2(intj)coutconstructingB2jendl;classB3/基类B3,构造函数无参数public:B3()coutconstructingB3*endl;派生类的构造、析构函数本讲稿第四十四页,共七十六页classC:publicB2,publicB1,publicB3public:/派生类的公有成员C(inta,intb,intc,intd):B1(a),memberB2(d),memberB1(c),B2(b)private:/派生类的私有对象成员B1memberB1;B2memberB2;B3memberB3;intmain()Cobj(1,2,3,4);运行结果:constructing B2 2constructing B1 1constructing B3*constructing B1 3constructing B2 4constructing B3*45本讲稿第四十五页,共七十六页继承时的析构函数o析构函数也不被继承,派生类自行声明o声明方法与一般(无继承关系时)类的析构函数相同。o不需要显式地调用基类的析构函数,系统会自动隐式调用。o析构函数的调用次序与构造函数相反。派生类的构造、析构函数本讲稿第四十六页,共七十六页例7-6派生类析构函数举例派生类的构造、析构函数#includeusingnamecpacestd;classB1/基类B1声明public:B1(inti)coutconstructingB1iendl;B1()coutdestructingB1endl;classB2/基类B2声明public:B2(intj)coutconstructingB2jendl;B2()coutdestructingB2endl;classB3/基类B3声明public:B3()coutconstructingB3*endl;B3()coutdestructingB3endl;本讲稿第四十七页,共七十六页classC:publicB2,publicB1,publicB3public:C(inta,intb,intc,intd):B1(a),memberB2(d),memberB1(c),B2(b)private:B1memberB1;B2memberB2;B3memberB3;intmain()Cobj(1,2,3,4);48本讲稿第四十八页,共七十六页例7-6运行结果constructingB22constructingB11constructingB3*constructingB13constructingB24constructingB3*destructingB3destructingB2destructingB1destructingB3destructingB1destructingB2本讲稿第四十九页,共七十六页同名隐藏规则当派生类与基类中有相同成员时:o若未强行指名,则通过派生类对象使用的是派生类中的同名成员。o如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定。派生类成员的标识与访问本讲稿第五十页,共七十六页例7-7多继承同名隐藏举例派生类成员的标识与访问#includeusingnamecpacestd;classB1/声明基类B1public:/外部接口intnV;voidfun()coutMemberofB1endl;classB2/声明基类B2public:/外部接口intnV;voidfun()coutMemberofB2endl;classD1:publicB1,publicB2public:intnV;/同名数据成员voidfun()coutMemberofD1endl;/同名函数成员;本讲稿第五十一页,共七十六页intmain()D1d1;d1.nV=1;/对象名.成员名标识,访问D1类成员d1.fun();d1.B1:nV=2;/作用域分辨符标识,访问基类B1成员d1.B1:fun();d1.B2:nV=3;/作用域分辨符标识,访问基类B2成员d1.B2:fun();52本讲稿第五十二页,共七十六页二义性问题o在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)采用虚函数(第8章)或同名隐藏规则来解决。o当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性采用虚基类来解决。派生类成员的标识与访问本讲稿第五十三页,共七十六页二义性问题举例(一)classApublic:voidf();classBpublic:voidf();voidg();classC:publicA,piblicBpublic:voidg();voidh();如果声明:Cc1;则c1.f();具有二义性而c1.g();无二义性(同名覆盖)派生类成员的标识与访问本讲稿第五十四页,共七十六页二义性的解决方法o解决方法一:用类名来限定c1.A:f()或c1.B:f()o解决方法二:同名覆盖在C中声明一个同名成员函数f(),f()再根据需要调用A:f()或B:f()派生类成员的标识与访问本讲稿第五十五页,共七十六页二义性问题举例(二)classBpublic:intb;classB1:publicBprivate:intb1;classB2:publicBprivate:intb2;classC:publicB1,publicB2public:intf();private:intd;派生类成员的标识与访问本讲稿第五十六页,共七十六页派生类C的对象的存储结构示意图:bb1bb2dB类成员B类成员B1类成员B2类成员C类对象有二义性:Cc;c.bc.B:b无二义性:无二义性:c.B1:bc.B2:b57本讲稿第五十七页,共七十六页虚基类o虚基类的引入n用于有共同基类的场合o声明n以virtual修饰说明基类例:classB1:virtualpublicBo作用n主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.n为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝o注意:n在第一级继承时就要将共同基类设计为虚基类。本讲稿第五十八页,共七十六页虚基类举例classBprivate:intb;classB1:virtualpublicBprivate:intb1;classB2:virtualpublicBprivate:intb2;classC:publicB1,publicB2private:floatd;下面的访问是正确的:Ccobj;cobj.b;虚 基 类本讲稿第五十九页,共七十六页虚基类的派生类对象存储结构示意图:BB1B2Cb1b2dB1类成员B2类成员C类对象bB类成员60本讲稿第六十页,共七十六页例7-8虚基类举例 虚 基 类D1nV:int nVd:intB1:nV1:intB2:nV2:intfund():voidfun():voidB1nV1:intB2nV2:intD1nVd:intfund():void B0nV:intfun()本讲稿第六十一页,共七十六页B0B1新增成员B0B2新增成员D1新增成员B0B0B1B2D1nV,fun()62本讲稿第六十二页,共七十六页#includeusingnamecpacestd;classB0/声明基类B0public:/外部接口intnV;voidfun()coutMemberofB0endl;classB1:virtualpublicB0/B0为虚基类,派生B1类public:/新增外部接口intnV1;classB2:virtualpublicB0/B0为虚基类,派生B2类public:/新增外部接口intnV2;63本讲稿第六十三页,共七十六页classD1:publicB1,publicB2/派生类D1声明public:/新增外部接口intnVd;voidfund()coutMemberofD1endl;intmain()/程序主函数D1d1;/声明D1类对象d1d1.nV=2;/使用最远基类成员d1.fun();64本讲稿第六十四页,共七十六页虚基类及其派生类构造函数o建立对象时所指定的类称为最(远)派生类。o虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。o在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。o在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。虚 基 类本讲稿第六十五页,共七十六页有虚基类时的构造函数举例 虚 基 类#includeusingnamecpacestd;classB0/声明基类B0public:/外部接口B0(intn)nV=n;intnV;voidfun()coutMemberofB0endl;classB1:virtualpublicB0public:B1(inta):B0(a)intnV1;classB2:virtualpublicB0public:B2(inta):B0(a)intnV2;本讲稿第六十六页,共七十六页classD1:publicB1,publicB2public:D1(inta):B0(a),B1(a),B2(a)intnVd;voidfund()coutMemberofD1endl;intmain()D1d1(1);d1.nV=2;d1.fun();67本讲稿第六十七页,共七十六页综合举例o例7-10(课后阅读)o这个程序有两点不足:基类的成员函数pay()的函数体为空,在实现部分仍要写出函数体,显得冗余。在main()函数中,建立了四个不同类的对象,对它们进行了类似的操作,但是却重复写了四遍类似的语句,程序不够简洁。本讲稿第六十八页,共七十六页7.4综合应用下面通过范例讲解一个综合例子,通过这个例子读者可以进一步体会继承和多重继承的特点。本讲稿第六十九页,共七十六页范例o继承的应用主程序中创建派生类对象cm,然后按照基类1,基类2,派生类的顺序依次调用构造函数进行输出,释放对象时按照构造函数相反的顺序依次调用析构函数进行输出。本讲稿第七十页,共七十六页7.6跟我上机o设计一个基类base,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关的成员函数。再由base派生出教师类techer,包含职称和专业私有数据成员以及相关的成员函数。然后由1eader和techer类派生出教学主任类chairman。o请编写一个完整的C+程序,并采用一些数据进行输入输出。本讲稿第七十一页,共七十六页参考程序:#include#includeclassTimeinthh,mm,ss;/默认为private属性public:Time();Time(inthour,intminute,intsecond);Time(intsecond);Time(char*str);voidprint()couthh:mm:ssn;Time:Time()hh=0;mm=0;ss=0;本讲稿第七十二页,共七十六页Time:Time(inthour,intminute,intsecond)if(hour0|minute0|second0)hh=0;mm=0;ss=0;cout非法的初值!时间不能为负59)minute=minute+second/60;second=second%60;if(minute59)hour=hour+minute/60;minute=minute%60;if(hour23)hour=hour%24;hh=hour;mm=minute;ss=second;本讲稿第七十三页,共七十六页Time:Time(intsecond)hh=0;mm=0;if(second0)ss=0;cout非法的初值!时间不能为负59)mm=second/60;ss=second%60;if(mm59)hh=mm/60;mm=mm%60;if(hh23)hh=hh%24;本讲稿第七十四页,共七十六页Time:Time(char*string)char*str=newchar3;str0=string0;str1=string1;str2=0;hh=atoi(str);str0=string3;str1=string4;str2=0;mm=atoi(str);str0=string6;str1=string7;str2=0;ss=atoi(str);deletestr;本讲稿第七十五页,共七十六页voidmain()Timet1,t2(100,100,100),t3(3690),t4(18:56:34);coutt1:;t1.print();coutt2:;t2.print();coutt3:;t3.print();coutt4:;t4.print();本讲稿第七十六页,共七十六页

    注意事项

    本文(继承与派生精选文档.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开