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++对象模型:对象内存布局详解

相关推荐
jimy14 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
蒸蒸yyyyzwd5 小时前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
ctlover5 小时前
排序与查找算法详解
开发语言·python
YYYing.5 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
nvvas6 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
钓鱼的肝6 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
重生的黑客6 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
Hespethorn7 小时前
取 `X-Forwarded-For` 首段做频控 key,等于把限流开关交给了调用方
c++
米糕闯编程7 小时前
鱼香ros2(七)功能包组织C++节点
c++·ros2·cmakelists
Y3815326627 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库