C++类之虚函数表及其内存布局

当类中含有虚函数时,代码如下:

cpp 复制代码
#include<iostream>
class Base
{
public:
	Base(int i) :baseI(i) {};
	virtual void print(void) { std::cout << "Base::print()" << std::endl; }
	virtual void setI() { std::cout << "Base::setI()" << std::endl; }
	virtual ~Base() {}
private:
	int baseI;
};

int main()
{
	Base b(5555555);
	int * vfptr = (int *)(&b);
	std::cout << "虚函数表指针(vfptr)的地址是:" << vfptr << std::endl;
	typedef void(*Fun)(void);
	Fun vfunc = (Fun)*((int *)*(int*)(&b));
	std::cout << "第一个虚函数的地址是:" << (int *)*(int*)(&b) << std::endl;
	std::cout << "通过地址,调用虚函数Base::print():" << std::endl;
	vfunc();
	vfunc = (Fun)*((int *)*(int*)(&b) + 1);
	std::cout << "第二个虚函数的地址是:" << (int *)*(int*)(&b) + 1 << std::endl;
	std::cout << "通过地址,调用虚函数Base::setI():" << std::endl;
	vfunc();
	std::cout << "通过地址,访问私有成员baseI:" << *(((int *)(&b)) + 1) << std::endl;
	return 0;
}

验证结果如下:

内存布局如下:

参考文章

图说C++对象模型:对象内存布局详解

相关推荐
一直C8 分钟前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
Kismet_nvi15 分钟前
Python 基础核心知识点总结
开发语言·windows·python
爱学习的小邓同学20 分钟前
Golang语言入门
开发语言·后端·golang
老洋葱Mr_Onion38 分钟前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先
编码浪子1 小时前
Rust 智能指针深度实战:Box/Rc/Arc/RefCell 选型决策与内存管理避坑
开发语言·后端·rust
yichudu1 小时前
Python 装饰器 decorator
开发语言·python
电商API_180079052472 小时前
速卖通商品采集API技术文章
java·开发语言·c++·api·跨境电商·商品详情
一晌小贪欢2 小时前
Python办公14:批量解压文件夹内的所有 ZIP/RAR 并自动分类
开发语言·python·excel·数据可视化·python办公
郑州光合科技余经理2 小时前
海外版外卖系统架构:订单怎么流转、权限怎么分
java·开发语言·前端·系统架构·uni-app·php·ai编程
Python 实战手记2 小时前
企业微信主体变更公证书办理全解析:适用场景、材料规范、踩坑点与Python信息校验脚本
开发语言·python·企业微信