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

相关推荐
晚风予卿云月37 分钟前
【前缀和】一维前缀和 & 二维前缀和
数据结构·c++·算法
Old Uncle Tom39 分钟前
Harness Engineering 综述
java·开发语言·数据库
星原望野42 分钟前
JAVA:策略模式的实战使用
java·开发语言·策略模式
码界筑梦坊42 分钟前
282-基于Python的豆瓣音乐可视化分析推荐系统
开发语言·python·信息可视化·数据分析·flask·vue
LJianK143 分钟前
java多态
java·开发语言·python
_Evan_Yao44 分钟前
栈与队列:后进先出与先进先出的智慧
开发语言·python
myjs9991 小时前
意识的两种类型
c++
z落落1 小时前
C# 构造函数(无参/有参/重载/this)+析构函数(终结器)|GC 垃圾回收
java·开发语言·c#
kkeeper~1 小时前
0基础C语言积跬步之自定义类型结构体
c语言·开发语言
z落落1 小时前
C# 字段与属性(get/set访问器、三种属性写法、只读属性)+属性拦截例子(get动态计算 + set数据校验)
开发语言·c#