网站大量收购独家精品文档,联系QQ:2885784924

[工学]面向对象技术与C++第五章.ppt

  1. 1、本文档共75页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]面向对象技术与C第五章

多态性 目标 静态联编与动态联编的区别 学会运算符重载的方法 友员运算符函数和成员运算符函数的不同 掌握虚函数的概念 知道什么是纯虚函数,什么是抽象类 内容 静态联编和动态联编 函数重载 运算符重载 虚函数 静态联编和动态联编 面向对象程序设计的三大特征:封装性、继承性和多态性;这三大特征相互关联,其中封装性是基础,继承性是关键,多态性是补充 多态性:指不同对象收到相同的消息时,产生不同的动作,是面向对象程序设计的重要特性之一 C++中,多态性的实现和联编这一概念有关。一个源程序经过编译、连接,成为可执行文件的过程就是把可执行代码联编在一起的过程 静态联编和动态联编 静态联编 定义:在运行之前就完成的联编,又叫前期联编 支持的多态性:静态多态性,即编译时多态性,通过重载函数和运算符实现 特点:函数调用速度快,效率高 动态联编 定义:在程序运行时才完成的联编,又叫后期联编 支持的多态性:动态多态性,即运行时多态性,通过继承和虚函数实现 特点:更好的灵活性、抽象性和易维护性 静态联编 让我们分析下面的程序,看看程序的运行结果如何? 静态联编 静态联编 静态联编 静态联编 静态联编 静态联编 静态联编 静态联编 通过上面的程序我们了解到静态联编的概念 如果想真正的达到我们预想的效果,那么就应该使用动态联编技术 静态联编的关键:函数重载 函数重载的基础知识已经在第二章中详细讲述了 函数重载是实现静态联编的关键技术 函数重载在C++中的实现机制是:名字压延 名字压延技术 C++采用名字压延技术实现函数重载的静态连编 名字压延:为了获取编译时函数名称的唯一的效果,C++把重载函数的本名和参数结合起来,以创造函数的新名字。 动态联编 问题的提出: 继承允许把许多继承同一个基类的派生类看作同一类型,使得使用同一段代码进行处理。有了继承以后,一个对象的功能变窄,它将只能产生我们在基类中定义好的行为,而不能随实际情况动态的变化。 例:建立一个“绘画工作室”程序,它只进行简单的画或擦除动作。所有的图形都继承基类shape,并且都覆盖了基类成员函数接口draw()和erase(),以产生相应的特定的图形绘画动作。我们还定义了studio类,它提供函数调用shape及其派生类对象的draw()和erase()接口函数,用来画或擦除一个图形。 动态联编 在例子中要建立的“绘画工作室” ,它所描述的基类shape和派生类line,triangle、circle之间的关系如下图所示。 动态联编 解决方案: 分析上例发现程序没有达到我们程序设计的目的。其原因是由于继承产生。 如何解决这个问题?采用虚函数解决这类问题,下面我们对上例进行改进,引入虚函数。 动态联编 在上一个例子中,我们预想的程序的运行结果应该是: 要使用动态联编,必须将函数area说明为虚函数 只要将关键字virtual放在类中该函数的函数说明之前 使用virtual修饰的成员函数称为虚函数 虚函数 虚函数只能是类中的一个成员函数,但不能是静态成员 关键字virtual用于类中该函数的说明中 当在派生类中定义了一个同名的成员函数时,只要该成员函数的原型与基类中同名的虚函数原型完全一样,则无论是否为该成员函数使用virtual,它都将成为一个虚函数 虚函数 使用虚函数保证了在通过一个基类类型的指针(包括引用)调用一个函数时,C++系统对该调用进行动态联编 通过对象访问一虚函数时则决定对其使用静态联编 虚函数 基类类型指针和派生类对象之间的关系 指针类型为基类的指针可以指向它的公有派生的对象,但不允许指向它的私有派生的对象(引用也一样) 虚函数 基类类型指针和派生类对象之间的关系 允许将一个指针类型为基类的指针指向其公有派生类的对象,但不能将一个指针类型为派生类的指针“直接”指向其基类的对象 虚函数 基类类型指针和派生类对象之间的关系 指针类型为基类的指针,当其指向公有派生类对象时,只能用它来直接访问派生类从基类继承来的成员,而不能“直接”访问公有派生类中定义的成员 虚函数的实现机制 虚函数的实现机制 多出来的这个空间用来存储什么? VPTR(Virtual Pointer)---虚拟指针 用VPTR指向什么? VTABLE(Virtual TABLE) VPTR和VTABLE只有使用虚函数时才会被系统生成 VPTR是类中的每一个对象都会拥有 VTABLE是一个类中的所有对象的公有 VTABLE中存放虚函数的入口地址 VTABLE中的虚函数的顺序是按照基类中虚函数的声明顺序来决定的 虚函数的实现机制 让我们看看上面那个例子中对象在内存中的分配图: 虚函数的实现机制 假定在two_virtual类的

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档