鸡啄米c++多态.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
鸡啄米c多态

第八部分:多态性 上一节讲完赋值兼容规则后,编程入门中继承与派生的部分就讲完了。今天开始讲解面向对象设计中的多态性。 ???????鸡啄米先介绍一个概念:消息。消息在C++编程中指的是对类的成员函数的调用。多态就是指相同的消息被不同类型的对象接收会引起不同的操作,直接点讲,就是在不同的情况下调用同名函数时,可能实际调用的并不是同一个函数。 ???????以“+”运算符为例,“+”可以实现整型变量之间、浮点型变量之间的加法运算,也可以实现不同类型变量之间的加法运算,例如整型变量和浮点型变量相加,这时需要先将整型变量转换为浮点变量再进行加法运算。同样是加法运算,参与运算的变量类型不同时,进行加法运算的方式也不同。这就是多态的典型例子。 ?????? 1.多态的类型 ???????多态性有四种类型:重载多态、强制多态、参数多态和包含多态。 ?????? 前两种可以统称为专用多态。之前鸡啄米讲过普通函数的重载和类的成员函数的重载,它们都属于重载多态。上面说的整型变量和浮点型变量相加时,需要先把整型变量强制转换为浮点型再进行加法运算,这就是强制多态。从概念上讲,强制多态就是将一个变量的类型进行转换,以满足一个函数运算的要求。 ???????后两种统称为通用多态。前面讲过的类模板将类型参数化,设定了确定的类型才可以实例化。由类模板实例化得到的所有类都有相同的操作,但是被操作对象的类型不同,这就是参数多态。包含多态是指类族中不同类的同名成员函数实现的操作不相同。包含多态一般通过虚函数来实现。虚函数在我们进行软件开发设计时会经常用到,初学者在有了一定经验后会越来越多的使用虚函数。 ????? ?鸡啄米后面会主要讲重载多态的运算符重载和包含多态的虚函数。 ???????2.多态的实现 ???????从多态实现的阶段不同来分类可以分为编译时的多态和运行时的多态。 ???????编译时的多态是指在编译的过程中就确定了具体调用同名函数中的哪个函数,而运行时的多态则是在程序运行过程中才动态的确定调用的具体函数。这种确定调用同名函数的哪个函数的过程就叫做联编或者绑定。鸡啄米一般称其为绑定。绑定实际上就是确定某个标识符对应的存储地址的过程。按照绑定发生的阶段的不同可以分为:静态绑定和动态绑定。静态绑定就对应着编译时的多态,动态绑定对应运行时的多态。 ???????如果绑定过程发生在编译链接阶段,则称为静态绑定。在编译链接过程中,编译器根据类型匹配等特征确定某个同名标识究竟调用哪一段程序代码,也就是确定通过某个同名函数到底调用哪个函数体。1中的四种多态中有三种需要静态绑定:重载多态、强制多态和参数多态。 ?????? 而如果绑定过程发生在程序运行阶段,则成为动态绑定。在编译链接过程中无法确定调用的具体函数,就要等到程序运行时动态确定。包含多态就需要使用动态绑定实现。 ?????? 因为重载、强制和参数多态有关的内容鸡啄米前面都讲过,可能大家对它们的理解还不算困难。但是包含多态可能很难理解,但是没关系,后面鸡啄米会细讲包含多态的虚函数,大家会明白包含多态的强大。最后仍然是欢迎大家到鸡啄米博客交流。 上一节鸡啄米讲了多态性的概念和类型,多态有四种类型:重载多态、强制多态、参数多态和包含多态。这一节主要介绍重载多态中的运算符重载。 ???????一.运算符重载的概念 ????? ?为什么我们需要运算符重载?因为自定义数据类型有时也需要使用运算符进行某些运算,比如加法运算,但是预定义的运算符的操作数只能是基本数据类型,所以自定义数据类型的运算需要进行运算符重载。例如,有日期类Date声明如下: ?????? ?class Date ????? ? { ??????? public: ??????????????????? Date(int nYear, int nMonth, int nDay)? { m_nYear=nYear; m_nMonth=nMonth; m_nDay=nDay; }? // 构造函数 ????????????????????void show();?????? // 显示日期 ?????? ?private: ?????????????????? ?int m_nYear; ???????????????? ?? int m_nMonth; ?????????????????? ?int m_nDay; ?????? ?}; ???????假设我们声明了两个Date类的对象:Date date1(2011, 11, 1), date2(2012, 1, 6);。然后需要计算date1和date2所表示日期差多少天,也就是进行减法运算,最简单的就是用运算符“-”,但是如果直接写date2-date1,编译器会报错,因为编译器不知道怎

文档评论(0)

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

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

1亿VIP精品文档

相关文档