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

相关推荐
子安柠2 分钟前
Go语言并发编程:协程与管道详解
开发语言·后端·golang
程序大视界5 分钟前
【Python系列课程】Python面向对象(下):封装、继承与多态
开发语言·python
Lumbrologist8 分钟前
【C++】零基础入门 · 第 12 节:模板与 STL 入门
开发语言·c++
天月风沙17 分钟前
基于机器视觉的实验室器件仓储系统设计——内蒙古自治区国家级大创工程存档
开发语言·python
24zhgjx-fuhao18 分钟前
虚链路的配置
开发语言·网络·php
techdashen1 小时前
Rust 中的小字符串:smol_str 与 smartstring 的对决
开发语言·后端·rust
wanghu20241 小时前
ABC460_E题题解
c++·算法
devilnumber1 小时前
java自定义事件处理器极简版:「外卖点餐」场景
java·开发语言
小何code1 小时前
C语言【初阶】第1节,初识C语言
c语言·开发语言
代码小书生1 小时前
getpass,一个安全输入的 Python 库!
开发语言·python·安全