C++学习笔记(12)――多态与虚函数.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  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文档。上传文档
查看更多
C++学习笔记(12)——多态与虚函数 1.多态性 多态的概念: ????????? 在面向对象的概念中,多态性是指不同对象收到相同消息时,根据对象类不同产生不同的动作。 ? C++允许程序员发送相同消息到不同的相关对象,而由对象决定如何完成该动作,并且支持软件选择实现决策的时间。其中,运行时的多态是面向对象的程序设计语言所独有的。有人还认为,只有与动态联编相结合的多态才是真正的面向对象的多态。 ? 多态的特点: ?????????? 提供了把接口与实现分开的另一种方法; ?????????? 提高了代码的组织性和可读性,更重要的是它使软件的可扩充性有了充分的提高; ????????? 是OOP的一个重要特征,提供了丰富的逻辑关系清晰的描述对象方法的手段,提高了软件功能和版本进化的设计维护能力。 ? C++支持两种多态性: ?????????? 编译时多态:程序运行前发生的事件——函数重载、运算符重载——静态绑定 ?????????? 运行时多态:程序运行时发生的事件——虚函数机制 ——动态绑定 ????????????  2.函数绑定(function call binding) 绑定:将函数调用与函数体连接起来叫做绑定。 预绑定(early binding):绑定在程序运行之前进行(由编译器和连接器执行),也叫静态联编。 后绑定(late binding):编译器在编译时未确定要调用的函数,必须根据程序运行所产生的信息来通知调用哪一个函数,也叫动态联编。 C语言就只有一种绑定方式就是预绑定。 ??????????? 预绑定与后绑定的区别: 预绑定: ?????????? 意味着绑定基于的信息都是静态的,是编译和连接时就可以确定的; ????????? 编译系统根据指针(或引用)本身的类型,而不是它所指向的对象的类型来进行绑定;  ????????? 预绑定的实体包括一般函数、重载函数、非虚成员函数和非虚友元函数。 后绑定: ?????????? 在运行时,根据对象类型的不同来选择合适的函数调用,这些类型信息在编译时是不可知的,故只能用后绑定解决这一问题; ?????????? 拥有虚函数的类对象中,必然包含着相应的类型信息,否则动态绑定不可能实现; ?????????? 编译时的多态的实现,取决于程序的静态信息是否足够为相同的程序实体确定不同的标识符。这里的程序实体,是指程序代码中的各种名称和代码段; ????????? 要实现运行时的多态,进行动态联编,就必须使用虚函数。 ??????????????? 编译时的多态,表现在以下几方面: ?????????? 对于在一个类中说明的重载,编译系统根据重载函数的参数个数、类型以及顺序的差别,来分别调用相应的函数; ?????????? 对于在基类和派生类中重载函数,即使所带参数完全相同,由于它们属于不同的类,在编译时可以根据对象名前缀来加以区别;或者使用“类名::”前缀,也可以指示编译器分辨出应该调用哪个类的成员函数; ?????????? 调用编译时绑定的函数,优点是高效率,因为编译系统可以在运行前对代码进行优化;缺点是缺少灵活性,不能满足程序的可扩充性要求。 ????????????????????? ??????????????????????  例1:编写基类、派生类、子派生类,在基类中定义虚函数,并全部实现,定义每个类的对象,观察每种对象的大小及其内存分配规律。 ??????????? 代码如下: ??????????? /************************************************************************ *?虚函数彻底研究 ************************************************************************/ #include?IOSTREAM.H //基类 class?CBase { ????int?x;  public: ????CBase(int?n)?{x=n;} ????~CBase(){} ????virtual?void?SetX(int?n)?{x=n;} ????virtual?int?GetX()?{return?x;} }; //派生类 class?CDerive?:?public?CBase { ????int?x; public: ????CDerive(int?n1,int?n2):CBase(n1)  ????{ ????????x=n2; ????} ????~CDerive()?{} ????void?SetX(int?n)?{x=n;} ????int?GetX()?{ret

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档