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

相关推荐
weixin_440784113 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城3 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
XR1234567884 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟4 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君5 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1235 小时前
SpringDAO的用法
java·开发语言·数据库
2601_956121977 小时前
二分算法(知识点+题目)
c++·算法
格林威7 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏9 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
蒙奇·D·路飞-9 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc