C++类之虚函数表及其内存布局(一个子类继承一个父类)

代码如下:

cpp 复制代码
#include<iostream>
class Base
{
public:
	Base(int i) :baseI(i) {};
	int getI() { return baseI; }
	static void countI() {};
	virtual void print(void) { std::cout << "Base::print()"; }
	virtual void printFun(void) { std::cout << "Base::printFun()"; }
	virtual ~Base() {}

private:
	int baseI;
	static int baseS;
};

class Derive : public Base
{
public:
	Derive(int d) :Base(1000), DeriveI(d) {};
	//overwrite父类虚函数
	virtual void printFun(void) { std::cout << "Drive::printFun()"; }
	// Derive声明的新的虚函数
	virtual void printBeforeDestructor() { std::cout << "Drive::printBeforeDestructor()"; }
	virtual ~Derive() {}
	virtual void printAfterDestructor() { std::cout << "Drive::printAfterDestructor()"; }
private:
	int DeriveI;
};


typedef void(*Fun)(void);

int main()
{
	Derive d(2000);
	//[0]
	std::cout << "[0]Base::vptr";
	std::cout << "\t地址:" << (int *)(&d) << std::endl;
	//vprt[0]
	std::cout << "  [0]";
	Fun fun0 = (Fun)*((int *)*((int *)(&d)));
	fun0();
	std::cout << "\t地址:\t" << *((int *)*((int *)(&d))) << std::endl;

	//vprt[1]
	std::cout << "  [1]";
	Fun fun1 = (Fun)*((int *)*((int *)(&d)) + 1);
	fun1();
	std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 1) << std::endl;

	//vprt[2]析构函数无法通过地址调用,故手动输出
	std::cout << "  [2]" << "Derive::~Derive()" << std::endl;

	//vprt[3]
	std::cout << "  [3]";
	Fun fun3 = (Fun)*((int *)*((int *)(&d)) + 3);
	fun3();
	std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 3) << std::endl;
	//vprt[4]
	std::cout << "  [4]";
	Fun fun4 = (Fun)*((int *)*((int *)(&d)) + 4);
	fun4();
	std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 4) << std::endl;
	//[1]
	std::cout << "[1]Base::baseI=" << *(int*)((int *)(&d) + 1);
	std::cout << "\t地址:" << (int *)(&d) + 1;
	std::cout << std::endl;
	//[2]
	std::cout << "[2]Derive::DeriveI=" << *(int*)((int *)(&d) + 2);
	std::cout << "\t地址:" << (int *)(&d) + 2;
	std::cout << std::endl;
	return 0;
}

验证结果如下:

参考文章
图说C++对象模型:对象内存布局详解

相关推荐
承渊政道4 分钟前
【Python编程—从入门到实践】(让程序记得、恢复并解释失败:Python 文件、异常与JSON系统教程)
开发语言·python·pycharm·json·异常处理
aqiu11111111 分钟前
【C++算法打怪专栏】LeetCode 1. 两数之和(哈希表解法总结)
c++·算法·leetcode
一水鉴天17 分钟前
声调韵的序:从古汉语音韵到系统科学语言的场效应推演 20261013(千问)
开发语言·人工智能
郭庆汝18 分钟前
(六)MCP+A2A之——Playwright与BrowserUse:让AI学会像人类一样使用浏览器
开发语言·python
涉密IT资质笔记25 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
fpcc28 分钟前
c++编程实践—thread_local变量的应用
c++
北风toto38 分钟前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法
william_yangshun39 分钟前
WordCraft 观察:纯 Rust 重写文字处理器,把文档变成可编程对象
开发语言·后端·rust·文档自动化
j7~41 分钟前
【仿 RabbitMQ 项目】发布订阅消息队列 (篇九):队列数据管理,内存镜像 + SQLite 持久化实现
数据库·c++·分布式·sqlite·rabbitmq·队列数据管理
dtq042443 分钟前
C++ - 变量
开发语言·c++