- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.2多态性.ppt
面向对象程序设计 多态性 主要内容 多态性 虚函数 纯虚函数 抽象类 动物运动(Move)的多态性 多态性的概念 多态性是面向对象程序设计的重要特征之一。 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。 多态的实现: 函数重载 运算符重载 虚函数 静态绑定与动态绑定 静态绑定(静态联编/编译时多态) 联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数。 编译时的多态性提供了运行速度快的特点 绝大多数C语言代码 动态绑定(动态联编/运行时多态) 联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。 运行时的多态性则带来了高度灵活和抽象的特点 C++虚函数代码 运行时多态概念 C++运行时多态方式。 运行时多态是通过虚函数来实现的,当被继承的基类中含有虚方法时,基类指针根据所指对象的不同去调用不同的函数,具体调用哪个函数,只有程序运行的时候,才能知道,从而构成“运行时多态”。 虚函数概念 虚函数是动态绑定的基础,虚函数是非静态的成员函数。 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在函数实现时。 虚函数具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。 虚函数的示例1 虚函数的示例2 虚函数的示例3 虚函数的示例4 ——构造函数中的虚函数行为 虚函数在构造函数中的行为解释 对于在构造函数中调用一个虚函数的情况,被调用的只是这个函数的本地版本。 也就是说,虚机制在构造函数中不工作。其原因如下: 在任何构造函数中,对象可能只是部分被形成—我们只能知道基类已被初始化了,但不知道哪个类是从这个基类继承来的。 如果我们在构造函数中这样做,那么我们所调用的函数可能操作还没有被初始化的成员,即访问尚未被创建完成的对象,这将导致灾难的发生。 虚析构函数 何时需要虚析构函数(When)? 我们使用了基类的指针指向了派生类对象。释放该对象时,我们只有这个基类指针。因此,就存在通过基类指针删除派生类对象。 为什么需要(Why)? 当我们想delete在栈中已经用new创建的类的对象的指针时,就会出现问题。 如果这个指针是指向基类的,编译器只能知道在delete期间调用这个析构函数的基类版本。 我们已经知道,虚函数被创建恰恰是为了解决同样的问题。幸好,析构函数可以是虚函数,于是一切问题就迎刃而解了。 虚析构函数的注意事项 C++中没有虚构造函数 如果一个类的析构函数是虚函数,那么它的所有子类的析构函数也都是虚函数。 虚析构函数实现运行时多态,保证使用基类的指针就能够调用适当的析构函数针对不同的对象进行清理工作。 作为准则,任何时候在类中有虚函数,我们就应当直接增加虚析构函数(即便它什么事也不做)。这样,能保证以后不发生意外。 虚函数的示例5 虚函数的示例6-1-del_base_pointer.cpp 虚函数的示例6-2_del_base_pointer.cpp 虚函数的示例7——析构函数中的虚函数行为 析构函数有虚机制 构造函数没有 析构函数中虚函数行为 在析构函数中,只有成员函数的本地版本被调用,虚机制被忽略。 为什么是这样呢? 假设虚机制在析构函数中使用,那么调用下面这样的虚函数是可能的: 这个函数是在继承层次中比当前的析构函数“更靠外”(更晚派生的)。但是,有一点我们要注意,析构函数从“外层”被调用(从最晚派生析构函数向基本析构函数)。所以,实际上被调用的函数就可能操作在已被删除的对象上。因此,编译器决定在编译时只调用这个函数的“本地”版本。 重载、覆盖和隐藏 隐藏: B中的func会隐藏 A中的func; B的对象对A的func的 访问必须加上A:: 重载、覆盖和隐藏 重载: B类中的多个func 构成了重载 即:overload 重载、覆盖和隐藏 覆盖: 又叫改写;override 虚函数关系构成了覆盖; 覆盖导致系统的动态联编; B类的func()对A的func() 是虚函数关系; 其他func和A的不是 虚函数关系 纯虚函数 定义格式: class 类名 { … virtual 返回类型说明符 函数名 (参数表)= 0; … }; 特点: 没有具体实现的虚函数 函数的实现用赋值为0类表示 必须在派生类中重载 虚函数的示例8 纯虚函数带来的问题 对于纯虚函数所在的类,不能创建对象、函数参数、返回类型(非指针) 抽象类——概念 至少含有一个纯虚函数的类称为抽象类 设计抽象类的目的是为了多态地使
您可能关注的文档
最近下载
- 2025青岛版小学科学三年级上册1-5《制作动物分类图册》(教学课件)(新教材).pptx
- 标准图集-17J008 挡土墙(重力式、衡重式、悬臂式) 无水印.pdf VIP
- JJF(陕) 048-2021 一体化振动变送器校准规范.docx VIP
- 退药申请单.doc VIP
- 2025年中国镁铝尖晶石行业投资前景及策略咨询研究报告.docx
- 农牧民培训国家通用语言.pptx
- 2022年度国铁集团质量安全红线检查迎检实施方案(最终版) (2).pdf VIP
- 六年级数学上册第一单元圆基础测试题北师大.doc VIP
- (高清版)B/T 42584-2023 信息化项目综合绩效评估规范.pdf VIP
- 《建筑给水复合管道工程技术规程》CJJ@T155-2011.pdf VIP
文档评论(0)