- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C程序语言14C
C++程序设计实用教程 清华大学出版社 2008 第14章 继承与多态性 继承与派生概述 派生类对象的构造 多态性 14.3.1 虚函数 14.3.2 重载运算符享受多态性 14.3.3 虚析构函数 *多重继承 构造顺序 小结 14.3.3 虚析构函数 前面曾介绍过对象带资源的类需要 深拷贝构造函数 深赋值运算符函数 析构函数 前面有些程序中,已将析构函数设计成虚函数,如 类模板 LinkList 自定义版字符串类 String 下面举例说明,可能作为基类的类应该 定义析构函数 将析构函数声明为虚函数 程序之一(析构函数为虚函数) 保持程序中第5行的编译预处理宏定义指令 编译器将编译第14行语句,第16行语句不参加编译 即基类的析构函数为虚函数 程序之二(析构函数为非虚函数) 删除程序中第5行(只要将该行作为注释行即可) 编译器将编译第16行语句,第14行语句不参加编译 即基类的析构函数为非虚函数 14.3.3 虚析构函数 造成这种结果的根本原因是没有将基类的析构函数声明成虚函数。 当使用基类的指针操作派生类对象时,对非虚函数仅操作基类部分,无法处理派生类新增的数据空间; 而对于虚函数,则根据对象的类型操作对象的数据空间。 从类的设计来看 派生类的设计是无懈可击的 深拷贝构造、深赋值运算和析构函数一应俱全; 基类非常单纯(甚至没有数据成员),似乎是“没有问题” 这个例子告诉我们 若某个类可能成为基类,最好将其析构函数声明为虚函数。 14.3.4 纯虚函数与抽象类 现在讨论本节开始时所述的第一个伏笔。 我们再次讨论前面提到的Student类。 若不需要运行时的多态性,则其中计算学费的函数Tuition可以去掉; 若要使计算学费函数Tuition能迟后联编,则基类中的这个函数是必须的且应该声明为虚函数。 与另一个输出信息的虚函数Show不同的是,基类中计算学费的函数“只占位置、不作事情”。 这样的函数体不要也罢,让其成为一个纯粹的虚函数──纯虚函数。 14.3.4 纯虚函数与抽象类 纯虚函数是一种特殊的虚函数 在虚函数声明的函数首部后(分号前)写下记号“=0”后该虚函数就是一个纯虚函数。 纯虚函数没有函数体(当然也不需要定义),其作用只是“占个位置”,便于实现多态性。 至少含有一个纯虚函数的类被称为抽象类。 抽象类的唯一作用就是用来被继承的。在派生类中可以覆盖定义基类的纯虚函数。 抽象类的派生类也有可能仍然是抽象类(只要其中还有纯虚函数未被覆盖定义)。 当一个类中没有纯虚函数时,这个类便成为具体类。 14.3.4 纯虚函数与抽象类 不能创建抽象类的对象; 可以定义抽象类的指针变量指向由其派生的具体类的对象; 可以声明抽象类的引用,声明引用时必须用其派生的具体类的对象进行初始化。 上述后两项规定是为了实现动态多态性。 14.3.5 关于虚函数的说明 C++编译器默认是在先期联编的状态下编译程序的,只有当编译器遇到了虚函数、纯虚函数后,才将该函数作为迟后联编处理。 由于动态多态性是在程序运行时“认具体对象”,因此关于虚函数的应用有如下要求或建议。 只有类的成员函数才能被声明为虚函数,以实现动态多态性。可以考虑将所有可以设置成虚函数的成员函数都声明成虚函数是有好处的; 派生类直接继承基类的虚函数特性(派生类中可以省略保留字virtual),虚函数可以被覆盖。但重载虚函数(形式参数不同)或返回类型不同的函数将不是虚函数,除非另行声明。虚函数在类体外定义时不能有保留字virtual; 14.3.5 关于虚函数的说明 纯虚函数没有函数体。抽象类就是用来被继承的。不能创建抽象类的对象,但可以定义抽象类的指针变量、声明抽象类的引用; 构造函数、拷贝构造函数不能是虚函数,因为虚函数是认具体对象的,而执行构造函数时所处理的对象尚未构造完成,对象尚未成型; 静态成员函数不能是虚函数,因为静态成员函数不默认联系某对象; 析构函数可以是虚函数。而且最好将析构函数声明为虚函数,以便当对象生命期结束时能够确实调用自己的析构函数完成善后工作; 为了使一些作为友元函数的运算符享受到动态多态性带来的便利(如插入运算符“”等),应该在基类中声明一个虚函数或纯虚函数以便在派生类中覆盖,并被重载运算符函数调用。 14.4 *多重继承 前面所介绍的继承都只是单继承 包括多层派生──派生类的派生类。 客观事物有时是“一体多能”、“一身兼任数职”的。这意味着派生类从多个基类继承而来。 在职攻读研究生学位的教师(既是教师又是研究生); 优秀学生兼任学生辅导员(既是学生又兼任教师工作); 专业技术人员兼任管理工作(既是员工又是管理者); 打印复印一体机(既是打印机,又是复印机,还可能是电话机、传真机和扫描仪); 手机(是电话机、MP3播放器、M
您可能关注的文档
最近下载
- 供配电安全管理规程供配电安全管理规程.doc VIP
- ACS880 FPNO_21_PROFINET IO通讯调试指导.docx VIP
- 2025年新高考语文试题全国Ⅰ卷(附参考答案) .pdf VIP
- 人教鄂教版五年级上册科学全册单元测试含期中期末及答案.docx
- BH207 GL 12 050风险岗位应急处置管理制度 副本.docx VIP
- 中小学幼儿园基孔肯雅热健康教育课件.pptx VIP
- 2024版社区两委考试题目.pdf VIP
- 河南省南阳市2024-2025学年高二下学期7月期末质量评估政治试题.pdf VIP
- 2024年水发集团有限公司招聘真题.docx VIP
- 2024年无锡市工会社会工作者招聘考试真题 .pdf VIP
文档评论(0)