C程序设计教案.pptVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
my e-mail:haitao_mail@ C++程序设计教案 (14) 张海涛 第14节 多态与虚函数 之一 1 C++多态与虚函数的引入 2 C++如何实现晚捆绑 3 程序设计的常识与技巧 1 C++多态与虚函数的引入 (1)C程序员转变为C++程序员的三步: 第一步:简单地把C++作为一个“更好的C”,因为C++在使用任何函数之前必须声明它,并且对于如何使用变量有更苛刻的要求。简单地用C++编译器编译C程序常常会发现错误。 1 C++多态与虚函数的引入 (1)C程序员转变为C++程序员的三步: 第二步:进入“面向对象”的C++。这意味着,很容易看到将数据结构和在它上面活动的函数捆绑在一起的代码组织,看到构造函数和析构函数的价值,也许还会看到一些简单的继承。 许多用过C的程序员很快就知道这是有用的,因为无论何时,创建库时,这些都是要做的。然而在C++中,由编译器来帮我们完成这些工作。 在基于对象层上,很容易使我们感到正在创建数据类型—制造类和对象,向这些对象发送消息。 1 C++多态与虚函数的引入 (1)C程序员转变为C++程序员的三步: 第三步:使用虚函数。虚函数加强类型概念,而不是只在结构内和墙后封装代码,所以毫无疑问,对于新C++程序员,它们是最困难的概念。然而,它们也是理解面向对象程序设计的转折点。 “如果不用虚函数,就等于还不懂得OOP” 1 C++多态与虚函数的引入 (2)函数调用捆绑 把函数体与函数调用相联系称为捆绑(binding)。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。(C编译只有一种函数调用,就是早捆绑) 晚捆绑:这意味着捆绑在运行时发生,基于对象的类型。(又称为动态捆绑或运行时捆绑)当一个语言实现晚捆绑时,必须有一种机制在运行时确定对象的类型和合适的调用函数。这就是,编译器还不知道实际的对象类型,但它插入能找到和调用正确函数体的代码。晚捆绑机制因语言而异,一些种类的类型信息必须装在对象自身中。 1 C++多态与虚函数的引入 (3)虚函数 对于特定的函数,为了引起晚捆绑, C++要求在基类中声明这个函数时使用virtual关键字。 晚捆绑只对virtual起作用,而且只发生在我们使用一个基类的地址时,并且这个基类中有virtual函数,尽管也可以在更早的基类中定义。 为了创建一个virtual成员函数,可以简单地在这个函数声明的前面加上关键字virtual。对于这个函数的定义不要重复,在任何派生类函数重定义中都不要重复它(虽然这样做无害)。 如果一个函数在基类中被声明为virtual,那么在所有的派生类中它都是virtual的。在派生类中virtual函数的重定义通常称为越位。 1 C++多态与虚函数的引入例子 1 C++多态与虚函数的引入例子 1 C++多态与虚函数的引入 (4)扩展性 通过将play( )在基类中定义为virtual,不用改变tune ( )函数就可以在系统中随意增加新函数。 在一个设计好的OOP程序中,大多数或所有的函数都沿用tune( )模型,只与基类接口通信。这样的程序是可扩展的,因为可以通过从公共基类继承新数据类型而增加新功能。操作基类接口的函数完全不需要改变就可以适合于这些新类。 现在, instrument例子有更多的虚函数和一些新类,它们都能与老的版本一起正确工作,不用改变tune()函数: 2 C++如何实现晚捆绑 (1)晚捆绑如何发生? 所有的工作都由编译器在幕后完成。当我们告诉它去晚捆绑时(用创建虚函数告诉它),编译器安装必要的晚捆绑机制。因为程序员常常从理解C++虚函数机制中受益。 关键字virtual告诉编译器它不应当完成早捆绑,相反,它应当自动安装实现晚捆绑所必须的所有机制。这意味着,如果我们对brass对象通过基类instrument地址调用play(),我们将得到恰当的函数。 2 C++如何实现晚捆绑 (2) VTABLE 为了完成这件事,编译器对每个包含虚函数的类创建一个表(称为VTABLE)。在VTABLE中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为vpointer(VPTR),指向这个对象的VTABLE。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个VPTR ,并在VTABLE表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。 为每个类设置VTABLE 、初始化VPTR 、为虚函数调用插入代码,所有这些都是自动发生的,所以我们不必担心这些。利用虚函数,这个对象的合适的函数就能被调用,哪怕在编译器还不知道这个对象的特定类型。 2 C++如何实现晚捆绑—例子 wind4.cpp 2 C++如何实现晚捆绑—例子 2 C++如何实现晚

您可能关注的文档

文档评论(0)

118books + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档