- 1、本文档共51页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用抽象基类实施接口规则 将抽象基类看作是一种必须实施的接口。 抽象基类要求派生类覆盖其纯虚函数,即迫使派生类遵循ABC所设置的接口规则。 使用ABC使得组件设计人员能够制定接口规则,确保从ABC派生的所有组件都至少支持ABC制定的功能。 参看代码: acctabc.h acctabc.cpp usebrass3.cpp 纯虚析构函数 析构函数常常必须是虚的 纯虚函数不定义函数体 必须为纯虚析构函数提供一个函数体 违反常规 一个类层次中总是会调用所有的析构函数 如果不定义函数体,调用什么呢? 当类仅含有一个纯虚函数,阻止基类实例化 查看代码:UnAbstract.cpp 多重继承(Multiple Inheritanc) 描述有多个基类的类 必须限定每一个基类的继承方式 Class SingingWaiter : public Waiter, public Singer{…} 引发的问题 具有单一继承的各种特征 问题在于: 如何对待从多个相关基类继承同一种基类的多个实例? 如何使用从多个不同的基类继承同名的方法? 参看代码:work0.h、work0.cpp 有多少Worker对象? 执行哪个方法? 有多少Worker对象? class SingingWaiter : public Waiter, public Singer{…} 因为Waiter继承了Worker 而且Singer继承了Worker 所以SingingWaiter将包含两个Worker 于是 SingingWaiter ed; Worker* pw = ed; 将会出现二义性 事实上唱歌的侍者也只应包含一个姓名和一个ID 有多少Worker对象? 虚拟基类 虚拟基类使得从多个基类相同的类派生出的对象只继承一个基类对象 语法:在类声明中使用关键字virtual class Singer : virtual public Worker {…}; class Waiter : public virtual Worker {…}; class SingingWaiter : public Singer, public Waiter {…}; SingingWaiter对象将只包含一个Worker对象,从本质上说,继承的Singer和Waiter对象共享一个Worker对象 虚拟基类 虚拟基类 可否使虚拟行为成为多重继承的准则? 第一,有些情况下需要基类的多个拷贝 第二,需要额外的代价 第三,存在一些缺点 虚拟基类存在的缺点 构造函数信息传递 class A{int a;} class B:public A{int b; B(int m, int n): A(n);} class C:public B{int c; c(int q, int m, int n):B(m, n);} 对于虚拟基类而言,存在问题 SingingWaiter(const Worker* wk, int p, int v): Waiter(wk, p), Singer(wk, v); 自动传递消息时,将通过2条不同的途径,发生冲突 引发的新规则 当基类是虚拟时,禁止信息通过中间类自动传递给基类 构造基类时: 或者使用默认构造函数 或者显式调用所需的基类构造函数 SingingWaiter(const Worker* wk, int p, int v): Worker(wk), Waiter(wk, p), Singer(wk, v); 执行哪个方法? SingingWaiter newhire(“simon yf”, 2005, 6, soprano); newhire.Show(); 由于多重继承,每个直接基类都有一个Show()方法,产生二义性 可以使用作用域解析操作符来澄清意图: newhire.Singer::Show(); 执行哪个方法? 可以在SingingWaiter中重新定义Show(),并指出要使用哪个: void SingingWaiter::Show(){ Singer::Show();Waiter::Show();} 但是却两次调用Worker::Show(),显示姓名和ID两次 解决方案:各自基类组件只显示各自的信息,在派生子类中将组件组合起来 简而言之 当祖先相同时,使用多重继承必须引入虚拟基类,并修改构造函数初始化列表的规则。 另外,在编写类时要充分考虑到多重继承带来的函数名字问题。 参看代码: workermi.h、workermi.cpp、workmi.cpp 混合继承(?) 如果基类是虚拟基类,派生类将包含基类的一个子对象 如果基类不是虚拟基类,派生类将包含基类的多个子对象 如果混合在一起呢? 混合继承(?) 包含一
您可能关注的文档
- 1直线的倾斜角与斜率教学课件.ppt
- 1直线与圆的位置关系教学课件.ppt
- 24xxxx击筷子一二三四2.ppt
- 1重点单词拼写.ppt
- 24不动产资讯.ppt
- 2011年如东县中小学教师暑期校本研修“教育技术Ⅱ”之教学课件.ppt
- 1足球起源2足球规则3越位规则详解.ppt
- 24给予是快乐的教学课件.ppt
- 2011年我院部分骨肿瘤病变影像学分析教学课件.ppt
- 04增值税业务的会计处理专项.ppt
- 2023年人教版地理七年级(下册)期末综合能力测试卷及答案 .pdf
- 庆安集团有限公司校园招聘模拟试题附带答案详解完整.docx
- 山西沁新能源集团股份有限公司校园招聘模拟试题附带答案详解完整.docx
- 希捷国际科技无锡有限公司校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详解版推荐.docx
- 三聚硫氰酸三钠盐的合成及应用 .pdf
- 2024年信息安全管理政策和业务培训制度(三篇) .pdf
- 2025年农贸市场管理办法.doc
- 2025年山岭隧道监控量测报告.doc
- 2024年信息化岗位安全和保密责任制度(三篇) .pdf
- 庆安集团有限公司校园招聘模拟试题附带答案详解推荐.docx
文档评论(0)