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

相关推荐
神仙别闹1 小时前
基于Python实现英词语自动对齐系统
开发语言·python
akinggw1 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
老歌老听老掉牙1 小时前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
繁星蓝雨2 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光2 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
俩个逗号。。2 小时前
Kotlin flow 详解
android·开发语言·kotlin
程序猿乐锅3 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
扶尔魔ocy3 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw4 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt