当前位置: 首页 > 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/2569.html

相关文章:

  • 做网站简约学校网站网站联盟广告
  • 微信公众号人工客服咨询沧州网站seo公司
  • 网站开发 介绍 回扣合肥seo关键词排名
  • 怎么在阿里云建网站上海平台推广的公司
  • 工信局网站备案查询北京推广
  • 网站打开速度规定多长时间石家庄网站建设方案
  • 滁州网站建设推广怎么在网络上推广
  • 人才网站怎么建设网络热词英语
  • 做网站优化推广推广公司主要做什么
  • 天津智能网站建设哪里有广告推广策划方案
  • 政府网站建设成本十大免费cms建站系统介绍
  • 买外贸衣服的网站软文代写自助发稿平台
  • 手工制作方法公司关键词seo
  • 支付网站开发广告投放平台都有哪些
  • 怎么做动态网站asp手机优化软件哪个好用
  • 网站建设开发合同书谷歌推广平台
  • 做调查可以赚钱的网站搜索指数分析
  • 深圳响应式网站博客可以做seo吗
  • 西安市建网站找哪家2345网址导航是病毒吗
  • 娱乐网站后缀是什么热点军事新闻
  • 做律师网站搜索引擎下载入口
  • 网站运营推广这么做南宁网站推广营销
  • 做网站哪个公司最好百度开放平台
  • 中餐网站模板新浪博客
  • 北京专门给政府做网站的公司贵州快速整站优化
  • gateface做网站网络营销课程有哪些
  • wordpress展示企业主题免费下载网站如何做优化推广
  • 彩票网站搭建多钱搜索引擎关键词快速优化
  • 做棋牌开发的网站什么是sem
  • 做app网站的公司哪家好推广方式