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

平阳手机网站制作网站建设承诺

平阳手机网站制作,网站建设承诺,高中信息技术网站建设,网站模板 jsp目录 1. 引言 2. 单继承下的虚函数表 2.1 基本概念 2.2 示例分析 3. 多重继承下的虚函数表 3.1 基本概念 3.2 示例分析 4. 虚函数表指针(vptr)的存储 4.1 单继承 4.2 多重继承 5. 常见面试题解析 问题1:D 继承 B1 和 B2&#xff0…

目录

1. 引言

2. 单继承下的虚函数表

2.1 基本概念

2.2 示例分析

3. 多重继承下的虚函数表

3.1 基本概念

3.2 示例分析

4. 虚函数表指针(vptr)的存储

4.1 单继承

4.2 多重继承

5. 常见面试题解析

问题1:D 继承 B1 和 B2,D 新增虚函数放在哪里?

问题2:D 有几个虚表指针?

问题3:如果 B1 没有虚函数,B2 有虚函数

6. 总结


1. 引言

在C++中,虚函数是实现运行时多态(动态绑定)的核心机制,而虚函数表(vtable)和虚表指针(vptr)是实现这一机制的关键。理解虚函数在类对象模型中的存储方式,对于深入掌握C++面向对象编程至关重要。本文将详细分析:

  • 单继承下的虚函数表布局
  • 多重继承下的虚函数表布局
  • 虚函数表指针(vptr)的存储方式
  • 新增虚函数对虚表的影响

2. 单继承下的虚函数表

2.1 基本概念

当一个类包含虚函数时,编译器会为该类生成一个虚函数表(vtable),存储所有虚函数的地址。每个对象的内存布局中,前4字节(32位系统)或前8字节(64位系统)存储指向虚函数表的指针(vptr)。

2.2 示例分析

class A {
public:virtual void func1() { cout << "A::func1" << endl; }virtual void func2() { cout << "A::func2" << endl; }
};class B : public A {
public:virtual void func1() override { cout << "B::func1" << endl; } // 重写virtual void func3() { cout << "B::func3" << endl; }          // 新增
};

内存布局:

对象虚表指针(vptr)虚表内容
Avptr_AA::func1A::func2
Bvptr_BB::func1(重写), A::func2B::func3(新增)

关键点:

  • B 继承 A,因此 B 的虚表包含 A 的所有虚函数(func1 被重写,func2 保留)。
  • B 新增的 func3 附加到虚表末尾。

3. 多重继承下的虚函数表

3.1 基本概念

在多重继承中,派生类会为每个包含虚函数的基类维护一个独立的虚函数表。如果派生类新增虚函数,它们会附加到第一个基类的虚表末尾

3.2 示例分析

class B1 {
public:virtual void f1() { cout << "B1::f1" << endl; }
};class B2 {
public:virtual void f2() { cout << "B2::f2" << endl; }
};class D : public B1, public B2 {
public:virtual void f1() override { cout << "D::f1" << endl; }  // 重写 B1::f1virtual void f2() override { cout << "D::f2" << endl; }  // 重写 B2::f2virtual void f3() { cout << "D::f3" << endl; }           // 新增虚函数
};

内存布局:

对象虚表指针(vptr)虚表内容
Dvptr_B1D::f1D::f3(新增)
vptr_B2D::f2

关键点:

  • D 继承 B1 和 B2,因此有 2 个虚表指针vptr_B1 和 vptr_B2)。
  • D 新增的 f3 附加到 B1 的虚表末尾(因为 B1 是第一个基类)。
  • B2 的虚表仅存储 D 重写的 f2

4. 虚函数表指针(vptr)的存储

4.1 单继承

  • 只有一个 vptr,位于对象起始地址。
  • 示例:
A a;
B b;
cout << *(void**)&a; // 输出 A 的虚表地址
cout << *(void**)&b; // 输出 B 的虚表地址

4.2 多重继承

  • 每个基类对应一个 vptr,按继承顺序排列。
  • 示例:
D d;
void** vptr1 = *(void***)&d;                     // B1 的 vptr
void** vptr2 = *(void***)((char*)&d + sizeof(B1)); // B2 的 vptr

5. 常见面试题解析

问题1:D 继承 B1 和 B2D 新增虚函数放在哪里?

答案:放在第一个基类 B1 的虚表末尾。

问题2:D 有几个虚表指针?

答案:2 个(对应 B1B2)。

问题3:如果 B1 没有虚函数,B2 有虚函数

6. 总结

继承方式虚表指针数量新增虚函数存储位置
单继承1附加到基类虚表末尾
多重继承等于基类数量附加到第一个基类虚表末尾

关键结论:

  1. 虚函数表(vtable)是实现动态绑定的核心。
  2. 单继承时,派生类虚表包含基类虚函数 + 新增虚函数。
  3. 多重继承时,派生类为每个基类维护独立虚表,新增虚函数放在第一个基类虚表末尾。

文章转载自:

http://1ExFR3xM.bzsqr.cn
http://jMOc6rFI.bzsqr.cn
http://XBsVYvQg.bzsqr.cn
http://QP38nR9J.bzsqr.cn
http://xeMnfIox.bzsqr.cn
http://foKM4xFG.bzsqr.cn
http://D3vLRdBI.bzsqr.cn
http://NrJDMh09.bzsqr.cn
http://2HFKuQpC.bzsqr.cn
http://c3fabvxf.bzsqr.cn
http://ZqCCw6r6.bzsqr.cn
http://Kbe1ZQ3H.bzsqr.cn
http://o5ZEH2Yf.bzsqr.cn
http://ihBZjfQJ.bzsqr.cn
http://53gBlJHR.bzsqr.cn
http://AGa6bv8J.bzsqr.cn
http://GyYbGhZY.bzsqr.cn
http://HCLsTgIK.bzsqr.cn
http://RNuELVkd.bzsqr.cn
http://8EEH98Jk.bzsqr.cn
http://ndSmoMCv.bzsqr.cn
http://CFWwz92S.bzsqr.cn
http://e9D5Frlw.bzsqr.cn
http://eArGruqn.bzsqr.cn
http://bYxBXyaU.bzsqr.cn
http://kJcyHL6t.bzsqr.cn
http://WDyjDi1p.bzsqr.cn
http://oV3pmIeQ.bzsqr.cn
http://nwKRxvJC.bzsqr.cn
http://HWaxNRUO.bzsqr.cn
http://www.dtcms.com/wzjs/743504.html

相关文章:

  • 北京建设监督网站产品营销推广
  • 宁波象山网站建设wordpress如何生成app
  • 中国建材工程建设协会网站移动互联网公司有哪些
  • 网站验收时项目建设总结报告新媒体 数字营销 网站建设
  • 中国空间站照片合川集团网站建设
  • 网站表格怎么做网页制作素材图片是什么格式
  • 大型门户网站有哪些wordpress移除工具栏
  • 上海微信网站建设公司电话网站建实例
  • 苏州做网站哪家公司好湛江网站制作推广
  • 奉贤建设机械网站制作生成网站地图
  • 南昌公司网站开发wordpress去除图片id
  • 做网站首页有什么wordpress账号权限
  • 湖南网站建设 地址磐石网络最近高清中文在线国语字幕
  • 定制开发电商网站建设多少钱淘宝网页设计培训
  • 做网站图标按钮素材龙陵县住房和城乡建设局网站
  • 长沙企业网站建设企业常州百度推广公司
  • 做网站前端需要懂得企业网站建设费用做管理费用吗
  • 最好的网站建设哪家好网站建设运行情况报告
  • 坡头网站建设公司wordpress表格自适应
  • 销售网站平台怎么做的wordpress下滑显示导航
  • 天津手机版建站系统网站的基础服务
  • 镇江网站搜索优化c# 网站开发实例教程
  • 做淘宝网站报告网页空间层次
  • 怎么做可以聊天的网站吗东莞做网站哪个公司好
  • 长春做网站哪家便宜中国字体设计网
  • 网站建设基础培训邢台网站设计哪家专业
  • 简述商务网站建设网站同时做竞价和优化可以吗
  • 网站开发运营维护方案建议校园门户网站建设先进
  • 诸暨哪些公司可以制作网站前端培训机构出来的好找工作吗
  • 网站平台建设需要注意的是网站关键词在哪设置