当前位置: 首页 > news >正文

襄阳网站seo公司WordPress不会php

襄阳网站seo公司,WordPress不会php,亚马逊全球开店,苏州市建筑设计研究院【C笔记】C多态 一、多态的概念及实现1.1、什么是多态1.2、实现多态的条件1.3、实现继承与接口继承1.4、多态中的析构函数1.5、抽象类 二、多态的实现原理 一、多态的概念及实现 1.1、什么是多态 多态的概念#xff1a; 在编程语言和类型论中#xff0c;多态#xff08;英… 【C笔记】C多态 一、多态的概念及实现1.1、什么是多态1.2、实现多态的条件1.3、实现继承与接口继承1.4、多态中的析构函数1.5、抽象类 二、多态的实现原理 一、多态的概念及实现 1.1、什么是多态 多态的概念 在编程语言和类型论中多态英语polymorphism指为不同数据类型的实体提供统一的接口。多态类型英语polymorphic type可以将自身所支持的操作套用到其它类型的值上。 计算机程序运行时相同的消息可能会送给多个不同的类别之对象而系统可依据对象所属类别引发对应类别的方法而有不同的行为。简单来说所谓多态意指相同的消息给予不同的对象会引发不同的动作。 多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。 多态可分为变量多态与函数多态。变量多态是指基类型的变量对于C是引用或指针可以被赋值基类型对象也可以被赋值派生类型的对象。函数多态是指相同的函数调用界面函数名与实参表传送给一个对象变量可以有不同的行为这视该对象变量所指向的对象类型而定。因此变量多态是函数多态的基础。 多态的概念通俗来说就是多种形态 具体点就是去完成某个行为当不同的对象去完成时会 产生出不同的状态 。 举个例子比如 买票这个行为 当 普通人 买票时是全价买票 学生 买票时是半价买票 军人 买票时是优先买票。 1.2、实现多态的条件 实现多态的两个条件 1、被调用的函数必须是虚函数子类对父类的虚函数进行重写 重写三同函数名/参数/返回值虚函数 2、父类指针或者引用去调用虚函数。 举个例子 这时候就实现了多态即指向子类对象就调用子类对象的函数如果指向的是父类对象就调用的是父类对象的函数 其实C这里还有一个特殊情况就是如果父类的同名函数加上了virtual修饰了那么子类的同名函数就算不加virtual也是虚函数了即也构成多态 但我个人感觉函数加上的好因为可能会形成误导。 强调一定要是父类的指针或引用调用如果是对象就变成了普通调用了 此外虚函数的重写也还要满足三同函数名、参数、返回值相同只要有其中一个不满足也会变成普通调用。 但是这里还有非常尴尬的例外“协变”含义是虚函数的返回值类型可以不同但又一个条件子类和父类的返回值类型也必须是父子关系指针和引用。 其实“协变”也是C常常被诟病的一点因为它的应用场景实在太局限了我也是感觉它有点儿多余了我们只需要了解一下即可。 1.3、实现继承与接口继承 普通函数的继承实际上是一种实现继承也就是继承了函数的逻辑 例如 这里继承的是函数的实现所以变量_a改变了输出的结果也就改变了。 而虚函数继承的是函数的接口也就是父类和子类的接口是一样的只是实现的逻辑不一样。其目的主要是为了重写达成多态。 例如 因为这里继承的只是接口而实现逻辑是不同的所以打印出来的内容也就不同。也就实现了多态。 之所以说是子类继承了父类的接口是因为如果我们改变子类中的虚函数的默认参数是不起作用的 所以这也就解释了为什么子类的虚函数没有加virtual也依然是虚函数因为其接口就是继承了父类的。 1.4、多态中的析构函数 我们先来看一个现象 相信大家都能看出这段代码的问题这很明显值是一个普通调用。但是它new了一个B对象却只调用了A类的析构函数这岂不是有内存泄漏的风险 那该怎么解决这个问题呢如果要将析构函数也实现成多态的调用的话那子类和父类的析构函数名不可能相同啊不是冲突了 C正是为了解决这个问题对构造函数进行了一些处理 因为多态的原因编译器在底层会将析构函数的函数名统一处理成destructor()。 所以我们表面上看到的析构函数是是不同名的实际在底层他们都叫destructor()所以也就能实现多态了 1.5、抽象类 在虚函数的后面写上 0 则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类也叫接口类抽象类不能实例化出对象。 抽象类还有以下三个注意点 1、子类继承抽象类后也不能实例化出对象只有重写纯虚函数子类才能实例化出对象。 2、父类的纯虚函数强制了派生类必须重写才能实例化出对象。 3、纯虚函数也可以写实现{ }但没有意义因为是接口继承而子类被强制了重写纯虚函数所以{ }中的实现会被重写父类没有对象不能调用父类的实现所以父类实现纯虚函数也就没有意义了。 其实各种抽象的事物都可以定义成抽象类比如人、动物、汽车、水果……也就是它不具体指哪一个事物只是抽象的代表默写事物的总体特征。 比如说动物 二、多态的实现原理 这里有一个类我们试试来求一下它的大小 首先要说一点不管是普通成员函数还是虚函数都是不储存在类里面的都是存在代码段的。 可这里的类的大小为什么是8字节呢不应该是4字节吗 说明类里面一定还存了别的什么东西我们可以到监视窗口看看 我们会发现除了成员_a之外还多了一个_vfptr的东西这个其实是一个虚表指针它的本质是一个数组指针指向一个函数指针数组而被指向的这个函数指针数组就是虚表。 由于平台的不同虚表的位置也有可能不同有的实在类的最前面有的可能是在类的最后面。 一个含有虚函数的类至少有一个虚表指针。 我们可以到内存中去仔细的看看A类的结构 然后我们可以来看看虚表中到底有什么 所以我们可以来打印一下虚表中的内容看看它们是不是函数的地址如果是的话试试调用它 从结果来看确实是函数的地址因为所有的虚函数的地址都会存进虚表所以这里会打印四个。 有了上面的铺垫我们就可以来解释多态的真正原理了。 我们先让一个B类继承A类并重写func函数 然后我们再取出A类和B类的虚表对比看看 我们发现两个对象中的虚表里只有被重写的func()函数的地址不同而没有重写的print1()的地址则相同。所以虚函数的重写也被称为是虚函数的覆盖(其实是虚函数表的覆盖)。 有了以上的铺垫在我提出以下结论的时候才会逻辑自掐 多态的实现机制其实就是傻傻地通过虚表指针找到虚表再找到对应的虚函数。 之所以这种“傻傻”的行为能成功是因为在父类指针或引用指向子类的时候会发生“切片” A类的指针只会指向B对象中A类部分的内容所以也就只会在A类部分的虚表中查找。就算B类有多张虚表(当B类有多个直接父类时候就会有多张虚表)。父类A的指针通过切片之后也只会指向A类部分。 且因为虚表的位置在某个类中都是固定的所以偏移量也都是固定的所以B类有多少个直接父类他们父类的指针的寻址操作也都是统一的。
http://www.zqtcl.cn/news/785185/

相关文章:

  • 怎么提升网站流量做五金建材市场的网站
  • 网站合作流程h5网站怎么做api对接
  • asp.net 网站 结构手机客户端网站建设
  • 图片网站怎么做SEO参与网站建设注意
  • 网站界面设计案例教程wordpress更新报错
  • Dw做网站怎么加logo如何申请小程序店铺
  • 官方网站下载官方版本wordpress文字可以动的插件
  • 企业网站模板 免费下载网站建设服务采购方案模板下载
  • 在万网申请的域名_需要把万网的账户密码给做网站的吗做鱫视频网站
  • 网站建设360wordpress 音乐下载主题
  • 站群推广wordpress换logo
  • 苏州网站建设丶好先生科技电脑怎样做幻灯片的网站
  • 什么网站可以做线上邀请函大米网络营销推广方案
  • .net做网站实例 贴吧软件开发前景和发展
  • 合肥快速建站模板软件开发文档编制
  • 深圳免费网站设计平板做网站服务器
  • 注册或者浏览社交类网站时不恰当威宁做网站
  • 国外的电商网站有哪些方面沈阳医疗网站制作
  • 那个企业网站是用vue做的网站频道运营怎么做
  • 英语培训学校网站怎么做网站建建设公司和网络自建
  • 无法访问iis网站网站吸引客户
  • 郑州企业网站排名优化wordpress指定文章
  • 南京 网站开发宿州网站建设工作室
  • 龙海市城乡规划建设局网站河南郑州哪里可以做公司网站
  • 网站正能量晚上不用下载进入免费成都网站制作方案
  • 宝安做棋牌网站建设哪家公司便宜jsp网站搭建
  • 英文网站建设方法深圳信用网
  • ip查询网站用织梦后台修改网站logo
  • 网站编辑信息怎么做茶叶网站建设策划书ppt
  • 网站建设费摊销几年嵌入式软件开发用什么语言