




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章派生新类,2020/5/22,1,4.3.4派生类构造函数和析构函数,通过前面的学习,我们知道派生类的对象自动拥有基类的所有数据成员,所以,在定义派生类的构造函数时除了对派生类的数据成员进行初始化外,还必须初始化基类的数据成员。如果派生类中有对象成员时,还要初始化对象成员。派生类构造函数的一般格式如下:():(),();其中,总参数表包含完成基类初始化所需的参数。,第4章派生新类,2020/5/22,2,/rectangle.hclassPoint/baseclasspublic:Point(floatxx=0,floatyy=0)X=xx;Y=yy;voidMove(floatxOff,floatyOff)X+=xOff;Y+=yOff;floatGetX()returnX;floatGetY()returnY;private:floatX,Y;classRectangle:publicPoint/derivedclasspublic:Rectangle(floatx,floaty,floatw,floath):Point(x,y)W=w;H=h;floatGetH()returnH;floatGetW()returnW;private:floatW,H;,第4章派生新类,2020/5/22,3,/test.cpp#includerectangle.h#includeusingnamespacestd;intmain()Rectanglerect(2,3,20,10);rect.Move(3,2);coutThedataofrect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY(),rect.GetW(),rect.GetH()endl;return0;Therunresultis:Thedataofrect(X,Y,W,H):5,5,20,10,第4章派生新类,2020/5/22,4,注意,作为一般规则,派生类构造函数最好不要直接向一个基类数据成员赋值,而是通过初始化列表把值传递给基类的适当的构造函数。当基类中没有显式定义构造函数时,派生类构造函数的初始化列表可以省略对基类的初始化。当基类的构造函数使用一个或多个参数时,派生类必须定义构造函数,将参数传递给基类的构造函数。,第4章派生新类,2020/5/22,5,classPersonpublic:Person(conststringName,intAge,charSex);stringGetName()return(name);intGetAge()return(age);charGetSex()return(sex);voidDisplay();protected:/保护成员intage;private:stringname;charsex;Person:Person(conststringName,intAge,charSex):name(Name)age=Age;sex=Sex;voidPerson:Display()coutname:namet;/直接访问本类私有成员coutage:aget;coutsex:sexendl;,第4章派生新类,2020/5/22,6,classStudent:publicPersonpublic:/外部接口Student(stringpName,intAge,charSex,stringpId,floatScore):id(pId),Person(pName,Age,Sex)score=Score;stringGetId()return(id);floatGetScore()returnscore;voidDisplay();private:stringid;floatscore;voidStudent:Display()coutid:idt;coutage:aget;coutscore:scorename;Students1(name,19,f,03410101,95);/派生类对象coutname:s1.GetName()t;/访问基类成员函数coutid:s1.GetId()t;coutage:s1.GetAge()t;coutsex:s1.GetSex()t;coutscore:s1.GetScore()endl;s1.Display();/同名屏蔽s1.Person:Display();/显式访问基类公有成员函数return0;,第4章派生新类,2020/5/22,8,Student类由基类Person的成员和一个string类对象成员构成。在构建派生类对象时初始化顺序是:先是基类中的name对象成员,接着是基类的其它成员,然后是派生类中的id对象成员,最后是派生类的其它成员。尽管Person被放在初始化列表中的第二位,但总是先于id被初始化。构造函数执行顺序为:基类的构造函数对象成员构造函数派生类的构造函数。析构函数执行顺序刚好相反。Student类对象有两个Display(),这时可以用类名加作用域运算符来限定调用哪个Display()。如果不限定,则调用派生类的Display()。,第4章派生新类,2020/5/22,9,现在可以来解决前面提出的问题了,如图所示。但是销售经理具有经理和销售员的特征,即由两个基类派生而来,这涉及多继承。,第4章派生新类,2020/5/22,10,第4章派生新类,2020/5/22,11,4.4多继承与虚拟继承,一个类可以从一个或者多个基类派生而来。根据派生类继承基类的个数,将继承分为单继承和多继承。当派生类有多个基类时称为多继承。单继承可以看作是多继承的一个特例,多继承可以看作是多个单继承的组合,它们有很多相同特性。,第4章派生新类,2020/5/22,12,多继承派生类的定义,多继承派生类的定义格式如下class:,;与单继承一样,默认继承方式为私有继承。,第4章派生新类,2020/5/22,13,多继承派生类的构造函数,多继承派生类构造函数的定义格式如下():(),();其中,总参数表包含完成所有基类初始化所需的参数。,第4章派生新类,2020/5/22,14,多继承派生类的构造函数与单继承一样,要负责所有基类的初始化工作。构造函数执行顺序是:先执行所有基类的构造函数,再执行对象成员类构造函数,最后执行派生类的构造函数。处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的基类顺序,与派生类构造函数中所定义的成员初始化列表顺序无关。析构函数执行顺序与构造函数的执行顺序相反。,第4章派生新类,2020/5/22,15,示例多继承构造函数和析构函数执行顺序classA/定义基类Apublic:A(inti)a=i;coutAConstructorendl;voiddisp()couta=aendl;A()coutADestructorendl;private:inta;classB/定义基类Bpublic:B(intj)b=j;coutBConstructorendl;voiddisp()coutb=bendl;B()coutBDestructorendl;private:intb;,第4章派生新类,2020/5/22,16,classC:publicB,publicA/定义派生类C。B在前,A在后public:C(intk):A(k+2),B(k-2)/包含基类成员初始化列表c=k;coutCConstructorendl;voiddisp()A:disp();/用类名加作用域运算符限定B:disp();coutc=cendl;C()coutCDestructorendl;private:intc;intmain()Cobj(10);obj.disp();/调用类C的成员函数dispreturn0;,第4章派生新类,2020/5/22,17,提出问题,在现实问题中,存在这样的情况:那么C类从B1和B2类继承下来两份A类的成员,在使用时出现二义性,如何解决?,第4章派生新类,2020/5/22,18,第4章派生新类,2020/5/22,19,解决方案一,用作用域运算符“:”进行限定,显式访问基类成员。例如:派生类C的对象访问基类的disp函数时用“A:disp()”和“B:disp()”显式访问。,第4章派生新类,2020/5/22,20,解决方案二,为避免对基类成员访问的二义性问题,可以将派生类的直接基类(如Salesman、Manager)的共同基类(如Employee)设置为虚基类,这样共同基类(Employee)在内存中只有一个副本存在。即将Employee类设为虚基类!,第4章派生新类,2020/5/22,21,虚基类,虚基类的定义格式为:class:virtual;注:引进虚基类后,派生类对象中只存在一个虚基类成员的副本。,第4章派生新类,2020/5/22,22,示例虚基类classApublic:A()a=10;protected:inta;classA1:virtualpublicA/定义虚基类public:A1()coutaendl;classA2:virtualpublicA/定义虚基类public:A2()coutaendl;classB:A1,A2/私有继承public:B()coutaendl;intmain()Bobj;return0;,第4章派生新类,2020/5/22,23,示例虚基类,分析构造函数的调用顺序classBase1public:Base1()coutclassBase1endl;classBase2public:Base2()coutclassBase2endl;classLevel1:publicBase2,virtualpublicBase1/定义虚基类public:Level1()coutclassLevel1endl;classLevel2:publicBase2,virtualpublicBase1public:Level2()coutclassLevel2endl;classTopLevel:publicLevel1,virtualpublicLevel2public:TopLevel()coutclassTopLevelendl;voidmain()TopLevelobj;return0;,第4章派生新类,2020/5/22,24,第4章派生新类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 呼吸机检测技术课件
- 2025年中国灭藻剂市场调查研究报告
- 2025年中国挤压盒市场调查研究报告
- 2025年中国古陶纹名片纸市场调查研究报告
- 2025年中国PVC彩印吊卡袋市场调查研究报告
- 旅游管理毕业生答辩
- 呼伦贝尔介绍
- 冠心病支架术后血脂管理
- 2025至2030年中国鲜姜行业发展研究报告
- 2025至2030年中国高压机行业发展研究报告
- 乡镇养老院建设年度工作规划
- 公司外聘法人协议书
- 2025旧设备购买合同范本
- 土地入股公墓协议书
- 2025年中国煤炭装备制造行业分析与发展策略咨询报告(定制版)
- 2025年4月自考00041基础会计学试题及答案含评分标准
- 施工现场安全隐患常见问题试题及答案
- 中国传统艺术-篆刻、书法、水墨画体验与欣赏(黑龙江联盟)智慧树知到期末考试答案章节答案2024年哈尔滨工业大学
- 企业标准编写范本
- XXX药店二类医疗器械零售经营备案质量管理制度DOC
- 北京市总工会职工互助保障
评论
0/150
提交评论