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

如何阿里巴巴网站做推广方案企业网站搭建

如何阿里巴巴网站做推广方案,企业网站搭建,好的响应式网站,大数据智能营销获客系统目录 1.多态的概念 1.1运行时多态 1.2 编译时多态 2.多态的定义以及实现 2.1 多态构成的条件 2.2 虚函数 2.3 虚函数的重写/覆盖 2.3.1 虚函数重写的两个例外 1.协变 2.析构函数的重写 2.4 override 和final关键字 2.5 重载/重写/隐藏的对比 ​编辑 3. 抽象类 和…

目录

1.多态的概念

1.1运行时多态

1.2 编译时多态

2.多态的定义以及实现

2.1 多态构成的条件

2.2 虚函数

2.3 虚函数的重写/覆盖

2.3.1 虚函数重写的两个例外

1.协变

2.析构函数的重写

2.4 override 和final关键字

2.5 重载/重写/隐藏的对比

​编辑 

3. 抽象类 和纯虚函数

 


哈喽啊,各位博友们,今天咱们来学习C++多态,今天只讲实现部分,原理部分明天会讲的。

1.多态的概念

1.1运行时多态

多态多态,顾名思义,多种状态,什么的多种状态?函数的多种状态。即当你传不同的对象时,虽然调用的是同一个函数,但其实这个函数执行的行为是不同的。举个例子:买票的时候,有学生票,成人票。票就是要传的对象,而你的买票的地方是函数,虽然都是买票的,但是对于学生,是学生票,对于成人,是成人票。(行为不同)以上说的是动态多态(运行时多态)。当然,多态还有静态多态(编译时多态)。

1.2 编译时多态

编译时 多态(静态多态)主要就是我们前面讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。

来看一个代码图片吧。

没学多态之前是不是认为,这个输出语句调用的是同一个函数,但其实不是的,其实是调用了两个函数(因为变量的类型不同),这就是多态。

2.多态的定义以及实现

2.1 多态构成的条件

定义:是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。

条件:

1.必须是基类的指针或者引用调用的虚函数。

2.被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。

还有几点要注意一下:

要实现多态效果,第⼀,必须是基类的指针或引用,因为只有基类的指针或引用才能既指向基类 对象又指向派生类对象;第二,派生类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派 生类之间才能有不同的函数,多态的不同形态效果才能达到。

 观看上面的代码图片,可知:ptr是基类的指针或者引用吧,并且调用的还是虚函数吧,并且子类的虚函数还完成了重写。

注意:调用虚函数的为父类的指针或者引用,你传递的实参是父类定义的对象就调用父类的函数,传递的实参是子类定义的对象就调用子类的函数,(这个很重要)

在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用。

2.2 虚函数

前面老说虚函数,这到底是什么呢?可以这么说,虚函数是为了多态才出现的,同样,重写也是为了多态才出现的。

类成员函数前面加virtual修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。 

2.3 虚函数的重写/覆盖

虚函数的重写/覆盖:派生类中有⼀个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值 类型、函数名字、参数列表完全相同(这个指的是参数的类型,参数有无缺省值不影响)),称派生类的虚函数重写了基类的虚函数。

OK,来看一个题:

 OK,咱们来分析一下这道题,先看main函数,p是指向B类的,所以可以认为p是不是属于B的。那么p调用test函数。但是这个test函数是A类里的呀,好,B继承了A,所以B类定义的指针也可以调用test函数。test函数里有个func函数。

那么这个func函数到底是A类的this指针调用的,还是B类的this指针调用的呢?是A类this指针调用的,因为継承不能说把this指针都给继承过去吧,那就太扯淡了。正好,回顾一下多态的条件,这里是不是构成了多态?是的。但是,这里是B类的指针调用的test函数,所以应该打印B类的虚函数,但是呢,B类虚函数前面没有virtual呀?别着急,咱们前面说的,这样也可以,因为此时是继承了A类的函数名,返回类型,参数列表+B类的函数体。所以说,这里的val是1呀,不是0.所以说答案是B->1。

2.3.1 虚函数重写的两个例外

1.协变

咱们知道,只有返回类型,函数名,参数列表相同的才可以叫做重写,但是协变不同,协变可以让返回值类型不同,也可以构成重写。但是需要注意几点:。即基类虚函数返回基类对象的指针或者引 用,派生类虚函数返回派生类对象的指针或者引用。

当然,这里不仅仅可以返回当前基类和子类的类型,还可以返回其他有继承关系的类和类型。

2.析构函数的重写

析构函数的重写,析构函数名统一处理成destructor。

这里本人也分为几个部分,先来看第一个部分:

  

咱们先来看堆上申请的空间里存放资源的析构。这里delete会调用析构函数对吧。那么先来看第一个图,如果不加上virtual,那么这俩析构函数就不构成多态,由于他俩都是A类的指针,所以说只会析构A类中的资源。但是,假如B类中有资源,那么你只析构A类的,不管B类的,是不是会造成资源泄露的安全问题呀,所以,这种不构成多态的方法不可取。

那么第二张图就是构成了多态的情况,这种情况才是正确的情况。(即基类中的函数要设计成 虚函数,为了构成多态)。这种情况下,B类的析构函数是A类析构函数的重写(编译器对析 构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了 virtual修饰,派⽣类的析构函数就构成重写。)那么就可以同一个函数实现两种不同的行为了。

这里的第二个new B前面写A*,单纯是为了演示第一种不是多态的情况。还有就是子类的析构函数,调用完子类的析构,会再自动的调用基类的析构函数。

第二个就是对于栈上开的空间,执行完直接析构了(需要遵守子类的先析构,父类的再析构)。并且,这里有人就会说了,这里没有virtual,析构函数的名字又相同,不是会构成成员函数隐藏吗?不是只会调用子类的析构函数吗?不不,在这里,析构函数不遵守什么隐藏规则,不然就资源泄露了,完蛋了就。

2.4 override 和final关键字

从上⾯可以看出,C++对虚函数重写的要求⽐较严格,但是有些情况下由于疏忽,比如函数名写错参数 写错等导致无法构成重写,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结 果才来debug会得不偿失,因此C++11提供了override,可以帮助用户检测是否重写。如果我们不想让 派生类重写这个虚函数,那么可以用final去修饰。

 

这个没什么好说的,就是对于一些极端情况发生的检查。

2.5 重载/重写/隐藏的对比

 

3. 抽象类 和纯虚函数

在虚函数的后⾯写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被 派生类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例 化出对象,如果派生类继承后不重写纯虚函数,那么派生类也是抽象类纯虚函数某种程度上强制了 派生类重写虚函数,因为不重写实例化不出对象。

可以看出来,派生类中对虚函数进行了重写,那么这个派生类实例化对象就不会报错了。 

虚函数就是为了多态而出现的,所以不必要时没必须要写虚函数。

好啦,本篇就讲到这,剩下的比较难的原理部分以及扩展部分,明天讲。

本篇完..........

 

http://www.dtcms.com/wzjs/104157.html

相关文章:

  • 有没有做面粉美食的网站公司网络推广方法
  • 域名购买备案大地seo视频
  • 做网站需要学些什么条件永久免费自助建站平台
  • 设计师网站资源长安网站优化公司
  • 网站建设人员配置是怎样的百度免费发布信息网站
  • 网站源码怎么使用软文营销是什么
  • 网站建设发展趋势株洲企业seo优化
  • 工作室可以做什么行业深圳专门做seo的公司
  • 学网站设计培训电话软文代写平台有哪些
  • 互联网保险案例云南seo网络优化师
  • 学做投资网站好深圳网站设计专家乐云seo
  • 里水九江网站建设2023免费推广入口
  • 阜宁城乡建设局网站网销是做什么的
  • 新农村建设 网站南昌seo报价
  • 网上拿手工做的网站b2b电子商务网
  • 淄博怎么做网站国内新闻摘抄2022年
  • 网盘怎么做电影网站外贸营销推广
  • 0716网站建设太原整站优化排名外包
  • 战鼓网这种网站怎么做郑州网站推广电话
  • 网站内容如何更新百度免费官网入口
  • 外包网站开发合同百度快速排名 搜
  • 网站建设佰首选金手指三b2b商务平台
  • 好的网站建设商家外链平台
  • 软件开发项目管理办法网站优化塔山双喜
  • 专业婚纱摄影网站制作教育培训排行榜前十名
  • 迅美网站建设珠海seo快速排名
  • wp网站怎么用插件做html网页免费推广神器
  • wordpress 微信机器人网站seo站群软件
  • 画册设计需要注意的事项武汉做seo公司
  • 建设网站实验活动小结网站查询域名入口