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

相关推荐
zuowei28892 小时前
华为网络设备配置文件备份与恢复(上传、下载、导出,导入)
开发语言·华为·php
xiaohe072 小时前
超详细 Python 爬虫指南
开发语言·爬虫·python
嗑嗑嗑瓜子的猫2 小时前
Java!它值得!
java·开发语言
xiaoshuaishuai83 小时前
C# GPU算力与管理
开发语言·windows·c#
lsx2024063 小时前
SVN 创建版本库
开发语言
xiaotao1313 小时前
01-编程基础与数学基石:Python错误与异常处理
开发语言·人工智能·python
墨尘笔尖3 小时前
最大最小值降采样算法的优化
c++·算法
皮卡蛋炒饭.4 小时前
线程的概念和控制
java·开发语言·jvm
John.Lewis4 小时前
Python小课(1)认识Python
开发语言·python