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

相关推荐
小羊没烦恼!3 分钟前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
学Linux的语莫35 分钟前
python中类的常见写法
开发语言·python·状态模式
需要82637 分钟前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
dyxal1 小时前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
譕痕1 小时前
Rabbit 实例
java·开发语言·java-rabbitmq
综合简报1 小时前
黑五海外发稿投给谁?三类海外媒体发稿渠道的分工
开发语言·php·媒体
·present·1 小时前
CSAPP(lecture 3)
c++
大风起兮云飞扬丶2 小时前
Java——线程池
java·开发语言
别动我齐刘海2 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
我命由我123452 小时前
Python 开发 - Python 虚拟环境
运维·开发语言·后端·python·http·https·java-ee