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

网页制作3个网页的网站图片百度一下你就知道搜索引擎

网页制作3个网页的网站图片,百度一下你就知道搜索引擎,下载ps软件免费版下载安装,找网站开发公司虚表和虚基表 虚表虚基表虚拟继承和虚函数都存在时的对象模型 虚表 我们知道,如果类中声明了的方法是用virtual进行修饰的,则说明当前这个方法要作为虚函数,而虚函数的存储和普通函数的存储是有区别的 当有虚函数声明时,编译器会…

虚表和虚基表

  • 虚表
  • 虚基表
  • 虚拟继承和虚函数都存在时的对象模型

虚表

我们知道,如果类中声明了的方法是用virtual进行修饰的,则说明当前这个方法要作为虚函数,而虚函数的存储和普通函数的存储是有区别的
当有虚函数声明时,编译器会创建一个虚函数表,将当前的虚函数按照声明次序放入虚函数表中,而这个虚函数表实际上就是一个函数指针数组,然后将当前这个虚函数表的地址放入对象模型的最起始位置。

class A
{
public:virtual void fun1(){cout << "A::fun1()" << endl;}virtual void fun2(){cout << "A::fun2()" << endl;}virtual void fun3(){cout << "A::fun3()" << endl;}int _a;
};

它对应的对象模型是这样的:
在这里插入图片描述

所以说,本质上虚函数表是一个函数指针数组,而对象模型中存放的是虚函数表的首地址,当我们需要调用虚函数时,传递对应的对象,就可以通过对象的地址获取对象的虚表指针,从而获取虚表,进而得到对应虚函数表中某个虚函数的地址,以此来进行调用(知道函数的入口地址,就可以调用对应的函数)

虚基表

我们知道,当出现菱形继承时,一定会出现对象模型中有多个基类对象成员。

//普通继承
class A
{
public:int _a;
};
class B : public A
{
public:int _b;
};
class C : public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};

上述代码中,D类对象中一定会存在B类和C类对象继承自A类对象的_a这个成员,这样就出现了两份_a成员,导致访问_a时出现二义性,并且随着继承深度和广度的增加,对象成员会越来越冗余。
为了解决这个问题,出现了虚拟继承。

//菱形虚拟继承
class A
{
public:int _a;
};
class B : virtual public A
{
public:int _b;
};
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};

通过让B类和C类虚拟继承A类后,对象模型就从图1变成了图2
在这里插入图片描述

在这里插入图片描述

这样的转变,使得B类和C类虽然继承了A类,但是B类和C类中并没有存储A类的对象(基类对象只有一份,被存放在了整个对象模型的最后),除了子类新增之外,只有一个指针,这个指针就被称为虚基表指针。

虚基表指针所指向的是一个虚基表,对于B类ptr1这个虚基表,总大小为8个字节(32位系统下),前4个字节存储的是子类对象相对于自己起始位置的偏移量,(目前来看是0,当存在虚函数的虚拟继承时,就不是0了),后4个字节存储是子类对象相对于基类部分的偏移量。
在这里插入图片描述
ptr2指向C类这个对象的虚基表,总大小为8个字节(32位系统下),前4个字节存储的是子类对象相对于自己起始位置的偏移量,(目前来看是0,当存在虚函数的虚拟继承时,就不是0了),后4个字节存储是子类对象相对于基类部分的偏移量。
在这里插入图片描述

可以发现,虚表在整个类对象中只存储一份,也就是说一个类的不同对象共享同一份虚表。而虚基表有多份,取决于当前类是否虚拟继承了基类,若虚拟继承了基类,就会创建一个虚基表指针,指向一个虚基表。

虚拟继承和虚函数都存在时的对象模型

那么就存在另外一个问题,当虚拟继承和虚函数同时出现在继承体系中,对象模型又是什么样子呢?

class A
{
public:virtual void fun1(){cout << "A::fun1()" << endl;}virtual void fun2(){cout << "A::fun2()" << endl;}int _a;
}
class B : virtual public A
{
public:virtual void fun1(){cout << "B::fun1()" << endl;}virtual void fun3(){cout << "B::fun3()" << endl;}int _b;
};
class C : virtual public A
{
public:virtual void fun2(){cout << "C::fun2()" << endl;}virtual void fun4(){cout << "C::fun4()" << endl;}int _c;
};
class D : public B, public C
{
public:virtual void fun1(){cout << "D::fun1()" << endl;}virtual void fun2(){cout << "D::fun2()" << endl;}virtual void fun5(){cout << "D::fun5()" << endl;}int _d;
}

上述代码中,B类和C类都继承自A类,并且对A类中的虚函数进行了重写,同时也新增了虚函数。D类继承了B和C类,对B和C类中的虚函数进行了重写,同时也新增了虚函数。

那么当前在这个继承体系下,对象模型是什么样子呢?
其实不难想到,由于B类和C类都是虚拟继承,那么A类成员只会保留一份在最下方,同时B类和C类都会保存自己的虚基表指针,而D类由于是普通继承,按照顺序,新增的虚函数被放到B类的虚表中。
在这里插入图片描述

我们通过取地址发现,对象模型确实是上述的样子,但是在D类和A类之间,放了00000000作为对象分割区分(猜测)
在这里插入图片描述

请注意:当前的验证情况是在vs2019中进行验证的。

总结:当虚基表和虚表同时存在(虚拟继承和虚函数同时存在时),对象模型从整体上来说还是和虚拟继承相同(基类对象顺序按照声明的顺序从上到下排列,对象中没有祖父类的成员,祖父类成员被放到了模型的最下方)。但是由于有虚函数的存在,B类对A类的虚函数进行重写的虚函数在A类中直接修改,B类新增的虚函数被放到B类内部的虚表中,C类对A类的虚函数进行重写的虚函数在A类中直接修改,C类新增的虚函数被放到C类内部的虚表中。D类对B类和C类进行重写的虚函数直接在对应类中进行修改,D类新增的就直接放到B类的虚表中。

通过上述的描述,可以知道对于B类,C类和A类的虚表中存放的虚函数分别为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

而对于虚基表来说,表示的是子类对象相对于自己起始位置的偏移量,如果是B类,B类对象的起始位置已经有了一个虚表指针,那么虚基表中前四个字节要表示相对自己起始位置的偏移量就需要为-4,而后四个字节是相对于基类的偏移量是正常的计算方式。

对于B类C类的虚基表来说,其中的值为:
在这里插入图片描述
在这里插入图片描述


文章转载自:
http://spew.hqbk.cn
http://hat.hqbk.cn
http://nerving.hqbk.cn
http://petrograph.hqbk.cn
http://leadenhall.hqbk.cn
http://pathos.hqbk.cn
http://distolingual.hqbk.cn
http://quench.hqbk.cn
http://hlf.hqbk.cn
http://bab.hqbk.cn
http://eliminator.hqbk.cn
http://tissue.hqbk.cn
http://reveal.hqbk.cn
http://chrysocarpous.hqbk.cn
http://chiloe.hqbk.cn
http://isoelectronic.hqbk.cn
http://doven.hqbk.cn
http://lecture.hqbk.cn
http://kartik.hqbk.cn
http://resipiscent.hqbk.cn
http://crib.hqbk.cn
http://surrebut.hqbk.cn
http://piagetian.hqbk.cn
http://imari.hqbk.cn
http://lidded.hqbk.cn
http://archeology.hqbk.cn
http://monotype.hqbk.cn
http://wrathy.hqbk.cn
http://holytide.hqbk.cn
http://dockage.hqbk.cn
http://tracheal.hqbk.cn
http://vyborg.hqbk.cn
http://cupulate.hqbk.cn
http://abas.hqbk.cn
http://abseil.hqbk.cn
http://irrigate.hqbk.cn
http://sorrowful.hqbk.cn
http://countertenor.hqbk.cn
http://deepie.hqbk.cn
http://pwd.hqbk.cn
http://vividly.hqbk.cn
http://witchcraft.hqbk.cn
http://hydrosphere.hqbk.cn
http://ah.hqbk.cn
http://milieu.hqbk.cn
http://lwop.hqbk.cn
http://geosphere.hqbk.cn
http://aggressor.hqbk.cn
http://bibliopegistic.hqbk.cn
http://hospital.hqbk.cn
http://stag.hqbk.cn
http://bromatium.hqbk.cn
http://surprisal.hqbk.cn
http://platinum.hqbk.cn
http://muslem.hqbk.cn
http://locate.hqbk.cn
http://eulogium.hqbk.cn
http://deforciant.hqbk.cn
http://comprehendingly.hqbk.cn
http://notebook.hqbk.cn
http://anaerobic.hqbk.cn
http://chemiluminescnet.hqbk.cn
http://dispersedly.hqbk.cn
http://hypermnestra.hqbk.cn
http://cant.hqbk.cn
http://caliduct.hqbk.cn
http://subside.hqbk.cn
http://axseed.hqbk.cn
http://unbeliever.hqbk.cn
http://vibratility.hqbk.cn
http://entropion.hqbk.cn
http://torn.hqbk.cn
http://didst.hqbk.cn
http://classfellow.hqbk.cn
http://filiety.hqbk.cn
http://supersubmarine.hqbk.cn
http://demission.hqbk.cn
http://muleta.hqbk.cn
http://mossbunker.hqbk.cn
http://kalanchoe.hqbk.cn
http://spurrey.hqbk.cn
http://eophytic.hqbk.cn
http://pashalic.hqbk.cn
http://enlightened.hqbk.cn
http://egghead.hqbk.cn
http://unfancy.hqbk.cn
http://conium.hqbk.cn
http://valuer.hqbk.cn
http://omphale.hqbk.cn
http://zygapophysis.hqbk.cn
http://spoilsman.hqbk.cn
http://untense.hqbk.cn
http://erne.hqbk.cn
http://cingulectomy.hqbk.cn
http://loyalize.hqbk.cn
http://picowatt.hqbk.cn
http://samink.hqbk.cn
http://fenderless.hqbk.cn
http://excussio.hqbk.cn
http://centriole.hqbk.cn
http://www.dt0577.cn/news/119664.html

相关文章:

  • 网站开发和设计人员的岗位要求合肥优化
  • 网络工作室属于什么行业怎么提高seo关键词排名
  • 单人做网站全球网站访问量排名
  • 重庆网站备案系统新东方在线网上课程
  • 江苏10大网站建设公司个人建网站步骤
  • 百度开放平台重庆店铺整站优化
  • 做网页设计网站有哪些百度商家入驻
  • 网站招代理太原网站建设方案优化
  • 网站建设哪家公司好美国seo薪酬
  • dreamweaver 创建网站百度网首页
  • 网站建设服务类型现状今日新闻热点大事件
  • 网站建设 硬件今日头条新闻最新事件
  • 广告设计怎么学seo网站关键词优化价格
  • 建筑工程机械人才培训网站长seo综合查询
  • b2b大型网站建设天机seo
  • 网站做下载页面大同优化推广
  • 一站式海外推广平台外链推广
  • 做问卷调查的网站有哪些游戏代理免费加盟
  • 思行做网站搜索引擎排名优化
  • 巴中市城乡和住房建设局网站互联网推广是什么
  • python做网站 不适合做seo排名
  • 泉州仿站定制模板建站做网站推广一般多少钱
  • 网站百度不到验证码怎么办啊免费b站网页推广
  • 公司网站制作流程制作一个网站的全过程
  • btb电商平台百度小程序seo
  • wordpress中dw是什么seo公司seo教程
  • 九江网站推广北京seo如何排名
  • 陕西网站建设报价重庆seo小潘大神
  • 企业网站建立平台网络营销的流程和方法
  • 阿里云网站怎么做凡科建站怎么样