游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

虚函数,虚表深度剖析第一弹

  面向对象,从单一的类开始说起。classA{private:intma;intmb;};
  这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢?
  sizeof(A),8个字节,一个int占用四个字节。下图验证:
  这两个数据在内存中是怎样排列的呢?
  原来是这样,我们根据debug出来的地址画出a对象在内存的结构图
  如果classA中包含成员函数呢?A的大小又是多少?classA{public:voidfunc1(){}private:intma;intmb;};
  直接告诉你答案,类的成员函数多大?没人能回答你,并且不是本文的重点,类的成员函数是放在代码区的,不算在类的大小内。
  类的对象共享这一段代码,试想,如果每一个对象都有一段代码,光是存储这些代码得占用多少空间?所以同一个类的对象共用一段代码。
  共用同一段代码怎么区分不同的对象呢?
  实际上,你在调用成员函数时,a。func1()会被编译器翻译为A::func1(a),也就是Aconstthis,this就是a对象的地址。
  所以根据this指针就能找到对应的数据,通过这同一段代码来处理不同的数据。
  接下来我们讨论一下继承,子类继承父类,将会继承父类的数据,以及父类函数的调用权。
  以下的测试可以验证这个情况。classA{public:voidfunc1(){coutAfunc1endl;}private:intma;intmb;};classB:publicA{public:voidfunc2(){coutBfunc2endl;}private:intmc;};intmain(intargc,charconstargv〔〕){Bb;b。func1();b。func2();return0;}
  输出:Afunc1Bfunc2
  那么对象b在内存中的结构是什么样的呢?
  继承关系,先把a中的数据继承过来,再有一份自己的数据。
  每个包含虚函数的类都有一个虚表,虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。
  为了指定对象的虚表,对象内部包含指向一个虚表的指针,来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,vptr,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。classA{public:voidfunc1(){coutAfunc1endl;}virtualvoidvfunc1(){coutAvfunc1endl;}private:intma;intmb;};
  coutsizeof(A);,输出12,A中包括两个int型的成员变量,一个虚指针,指针占4个字节。
  a的内存结构如下:
  虚表是一个函数指针数组,数组里存放的都是函数指针,指向虚函数所在的位置。
  对象调用虚函数时,会根据虚指针找到虚表的位置,再根据虚函数声明的顺序找到虚函数在数组的哪个位置,找到虚函数的地址,从而调用虚函数。
  调用普通函数则不像这样,普通函数在编译阶段就指定好了函数位置,直接调用即可。classA{public:voidfunc1(){coutAfunc1endl;}virtualvoidvfunc1(){coutAvfunc1endl;}private:intma;intmb;};classB:publicA{public:voidfunc1(){coutBfunc1endl;}virtualvoidvfunc2(){coutBvfunc2endl;}private:intma;};
  像这样,B类继承自A类,B中又定义了一个虚函数vfunc2,它的虚表又是怎么样的呢?
  给出结论,虚表如下图所示:
  我们来验证一下:
  Aa;Bb;void(avfunc1)()(void()())(int)((int)a);void(bvfunc1)()(void()())(int)((int)b);void(bvfunc2)()(void()())(int)(((int)b)4);avfunc1();bvfunc1();bvfunc2();
  来解释一下代码:void(avfunc1)()声明一个返回值为void,无参数的函数指针avfunc1,变量名代表我们想要取A类的vfunc1这个虚函数。
  右半部分的第一部分,(void()())代表我们最后要转换成对应上述类型的指针,右边需要给一个地址。
  我们看(int()a),把a的地址强转成int,再解引用得到虚指针的地址。
  (int)((int)a)再强转解引用得到虚表的地址,最后强转成函数指针。
  同理得到bvfunc1,bvfunc2,4是因为一个指针占4个字节,4得到虚表的第二项。
  覆盖classA{public:voidfunc1(){coutAfunc1endl;}virtualvoidvfunc1(){coutAvfunc1endl;}private:intma;intmb;};classB:publicA{public:voidfunc1(){coutBfunc1endl;}virtualvoidvfunc1(){coutBvfunc1endl;}private:intma;};
  子类重写父类的虚函数,需要函数签名保持一致,该种情况在内存中的结构为:
  多态
  父类指针指向子类对象的情况下,如果指针调用的是虚函数,则编译器会将会从虚指针所指的虚函数表中找到对应的地址执行相应的函数。
  子类很多的话,每个子类都覆盖了对应的虚函数,则通过虚表找到的虚函数执行后不就执行了不同的代码嘛,表现出多态了嘛。
  我们把经过虚表调用虚函数的过程称为动态绑定,其表现出来的现象称为运行时多态。动态绑定区别于传统的函数调用,传统的函数调用我们称之为静态绑定,即函数的调用在编译阶段就可以确定下来了。
  那么,什么时候会执行函数的动态绑定?这需要符合以下三个条件。通过指针来调用函数指针upcast向上转型(继承类向基类的转换称为upcast)调用的是虚函数
  为什么父类指针可以指向子类?
  子类继承自父类,子类也属于A的类型。
  最后通过一个例子来体会一下吧:classShape{public:virtualvoiddraw()0;};classRectangle:publicShape{voiddraw(){coutrectangleendl;}};classCircle:publicShape{voiddraw(){coutcircleendl;}};classTriangle:publicShape{voiddraw(){couttriangleendl;}};intmain(intargc,charconstargv〔〕){vectorShapev;v。pushback(newRectangle());v。pushback(newCircle());v。pushback(newTriangle());for(Shapep:v){pdraw();}return0;}
  有些话是大白话,哈哈,如果这篇文章写得不错,解决了你的疑惑的话,点个赞再走吧!
  不对的地方也请指出来,大家一起学习进步。

摇起来某宝特价版(简称某特)最近推出了一个摇现金活动。刚开始我以为这是走拼夕夕的老套路,但是抱着一分也是爱的心思就试了一下,结果出乎意料之外的收获满满。活动内容很简单,设置了一……杨丽菁的电影及电视剧(73部电影22部电视剧)你看过杨丽菁的电影及电视剧吗?杨丽菁演技非常的棒,印象深刻的就是《中原镖局》中赵家三小姐,那个年代的男女主角是真心的美,演技也是极好的。下面给大家整理了杨丽菁的电影及电视剧合集……仙剑奇侠传1确定翻拍仙剑奇侠传1翻拍男女主角是谁网曝仙剑奇侠传1确定翻拍的消息上热搜引起巨大的热议和讨论!不得不说娱乐圈第一翻拍大剧要来了!据悉,胡歌、刘亦菲主演的《仙剑奇侠传1》确定翻拍,并且已经开始挑选角色了。1仙……既坚固又强硬利用细菌可制造汽车材料如果有人告诉你,细菌并不可怕,甚至还能制造出坚固、耐受和有弹性的工程材料,你会怎么想?这并非一种幻想,而是南加州大学维特比工程学院(USCViterbiSchoolOfEngi……温客行和周子舒小时候认识吗温客行和周子舒什么关系看过《山河令》的小伙伴应该对温客行和周子舒都很熟悉,那么有就很多网友很好奇,温客行和周子舒小时候认识吗还是长大才相识的,下面就和小编一起来看看吧。1温客行和周子舒小时候认……青簪行番位之争到底是怎么回事真相了原来是这样!近日,电视剧《青簪行》正式官宣表示男女主角是吴亦凡和杨紫,本来是件官宣电视剧的事,但是之后的番位之争让人不能理解,到底是怎么回事呢?真相原来是这样的!一起来看一下具体的详情。……玉蒲团系列电影古装剧情片中的经典玉蒲团系列电影:古装剧情片中的经典古代剧情片中玉蒲团相信听过最最多的可能就是了,玉蒲团一个系列有很多部情爱三级片电影,且都是古装,符合各种喜欢看古代三级片的喜好。玉……红魔手表首发评测半月一充的潮男新装备随着红魔手机6的发布,各家手机厂商纷纷推出自家的智能手表,连红魔也不例外,在发布会之后也是让用户在智能手表里面多了一个上上之选,今天给大家带来的体验就是刚刚发布的红魔手表。……财富世界500强榜单出炉,9家中国车企榜上有名8月2日,《财富》世界500强排行榜发布,今年世界500强排行榜企业的营业收入约为31。7万亿美元,比去年下降5,净利润总和为1。6万亿美元,同比大幅下降20,是2009年以来……清洁低碳,共享未来2021新能源汽车产业链展将于11月开幕指导单位:中国南方电网有限责任公司2021第三届广州国际新能源汽车产业生态链展览会(简称:EVE)将于2021年11月19日至22日在中国进出口商品交易会展馆举办。第三届……双汇系内斗终局可有赢家?独立稀缺穿透挑战序幕刚刚拉开。作者:于照野编辑:科科风品:司廷来源:铑财铑财研究院最是无情帝王家。历史上,因权力导致父子反目的案例不胜枚举。……9。17r日BTC火币全球站数据显示,BTC短线上涨,突破48000美元关口,现报48109。16美元,日内跌幅达到0。02,行情波动较大,但是整体还是处于一个慢涨形态,昨日回踩MA5止跌,这个……
最新电影2022年上映的汇总本篇最新电影2022年上映的汇总:从定档的电影中,筛选出几部有意思影片来解决大家即将到来的片荒。还有为定档上映的尤其令人期待。下面一起来看看最新电影2022年上映的有哪些吧。……热播电视剧排行榜2022前十名热播电视剧排行榜2022前十名。你知道目前最好看的电视剧有哪些吗?现在什么电视剧最好看呢?下面2022最好看的电视剧排行榜前十名,目前最好看的热播电视剧排行榜2022前十名相关……有什么好看的电视剧推荐一下2022(精选20部)1、《人世间》,根据梁晓声的同名小说改编。歌颂了中国人民拼搏向上、艰苦奋斗的伟大历程。2、《嫣语赋》,一部古装爱情剧。秋府最不受宠的大小姐秋嫣凭借自己的努力一步步收获幸福……2022热播电视剧排行榜前十名目前已经2022年5月份了,已经有不少播出的电视剧都是非常火的,那么2022热播电视剧排行榜前十名你看过有哪几部呢?今天给大家做一个2022热播电视剧排行介绍,感兴趣的一定要看……美剧推荐豆瓣高分10部豆瓣评分9。0以上灾难片灾难片其实一直都非常受一些年轻人的喜欢,他们都特别的喜欢看灾难片,但是有些朋友却找不到好看的灾难片,下面给大家盘点美剧推荐豆瓣高分,10部豆瓣评分9。0以上灾难片。好看的……双11TWS耳机购买攻略,这款丹拿调音35dB的国产旗舰64说到双十一,很多人的第一反应可能不是商品更优惠的价格,而是商家们更复杂的促销套路。对此网上有不少人都表示,早知道要参加双十一,当年上数学课的时候就该好好听讲了。不过,虽然双十一……大鹏教育退费一路绿灯靠谱有保障可能是天气慢慢变冷的原因吧,疫情又开始反复了。受疫情影响,我们这边小学都放假了,有几个小区也因为可能存在密切接触者封了。为了安全起见,大家还是尽量少出门吧。我本身就贪生怕死哈哈……恐怖午夜美剧排名前十名(重口味美剧豆瓣高评分)恐怖午夜美剧一、《鬼入侵》豆瓣评分:8。7改编于雪莉middot;杰克逊的小说,昔日风光一时的豪宅,受到诅咒成为鬼屋。马罗教授为进行一项心理实验,召集耐尔、赛奥、卢……可能是最好的微单随身包巅峰设计PeakDesignEveryPeakDesign(巅峰设计),是美国一个靠众筹起家的网红摄影包及附件品牌,他家的摄影包设计风格清新,不像白XX、乐XX、国XXX等传统摄影包或者老气横秋,或者强行加入一些所……高分的美剧排行10部可以说美剧是非常值得大家看的一类电视剧了,因为美剧的特效做的非常逼真,能给大家带来非常震撼的视觉体验,现在是2021年了,又有很多美剧上映,而且2021美剧排行榜前十名数据已经……感人就是神作?国王排名离神作还有些距离,别急今天还要延续《国王排名》的话题。昨天我发布了文章《让众多观众瞬间破防的《国王排名》,走红的背后是现实的冷漠》戳不中自己的泪点,结果好多人下面评论说是神作。嘛,说实话……全方位评测索尼WF1000XM4降噪登顶的真无线耳机?说到真无线降噪耳机,就不得不说索尼,很早就推出相关产品,然后一直在进步,现在的WF1000XM4更是对比上代,又是一步大提升,可谓是碰到了真无线耳机降噪的天花板了。到底有哪些提……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网