当前位置: 首页 > article >正文

多态对象的内存结构

这篇文章我们通过具体的案例来谈一谈多态的具体内存结构:

class Base
{
public:
	virtual void Func1()
	{
		cout << "Func1()" << endl;
	}
	virtual void Func2()
	{
		cout << "Func2()" << endl;
	}
	void Func3()
	{
		cout << "Func3()" << endl;
	}
private:
	int _b = 1;
};
class Derive : public Base
{
public:
	virtual void Func1()
	{
		cout << "Dereve:Func1()" << endl;
	}
	virtual void Func4()
	{
		cout << "Func4()" << endl;
	}
};
int main()
{
	Base a;
	Derive b;
	return 0;
}

我们将通过内存布局来直观展示 Base 类对象 aDerive 类对象 b 在内存中的结构。由于 Base 类和 Derive 类都有虚函数,它们会各自包含一个虚指针(vptr)指向对应类的虚表。

1. Base 类的对象 a 的内存布局

Base a;
内存结构:
+--------------------+          
| vptr (虚指针)      |  -> 指向 Base 类的虚表
+--------------------+
| _b (private int)   |  -> 值为 1
+--------------------+

vptr 指向 Base 类的虚表。Base 类的虚表如下:

Base 类的虚表:
+----------------------------+
| &Base::Func1                |  -> 指向 Base 类的 Func1 实现
+----------------------------+
| &Base::Func2                |  -> 指向 Base 类的 Func2 实现
+----------------------------+
  • Func1Func2 是虚函数,所以它们的函数指针存储在虚表中。
  • Func3 是普通成员函数,不在虚表中,它直接通过类调用,不需要虚表查找。
  • _bBase 类的私有成员变量,值为 1,占用内存。

2. Derive 类的对象 b 的内存布局

Derive b;
内存结构:
+--------------------+          
| vptr (虚指针)      |  -> 指向 Derive 类的虚表
+--------------------+
| _b (继承自 Base)    |  -> 值为 1
+--------------------+

 vptr 指向 Derive 类的虚表。Derive 类的虚表如下:

Derive 类的虚表:
+----------------------------+
| &Derive::Func1              |  -> 指向 Derive 类的 Func1 实现
+----------------------------+
| &Base::Func2                |  -> 指向 Base 类的 Func2 实现
+----------------------------+
| &Derive::Func4              |  -> 指向 Derive 类的 Func4 实现
+----------------------------+
  • Derive 类重写了 Func1,所以虚表中的 Func1 指针指向 Derive 类的 Func1 实现(Derive::Func1)。
  • Func2 没有被重写,因此虚表中的 Func2 仍然指向 Base::Func2
  • Derive 类新增了一个虚函数 Func4,所以 Func4 的地址也被存储在虚表中。
  • _b 是从 Base 类继承的成员变量,值为 1。

3.总结

  • Base a 的内存布局
    • 包含一个虚指针(vptr),指向 Base 类的虚表。
    • 包含一个私有成员变量 _b,值为 1。
  • Derive b 的内存布局
    • 包含一个虚指针(vptr),指向 Derive 类的虚表。
    • 继承了 Base 类的私有成员变量 _b,值为 1。


http://www.kler.cn/a/315858.html

相关文章:

  • SciPy:Python 科学计算工具包的全面教程
  • 《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信
  • LLMs之MindFormers:基于国产硬件华为Atlas针对GLM-4-9B实现模型全参微调(单机8卡)→模型推理(单卡多batch推理)
  • 问:MySQL主从同步的机制梳理?
  • 项目模块详细说明
  • 智慧仓储物流可视化平台
  • [Python学习日记-27] 文件操作练习题解析
  • Java的IO流(二)
  • 基于STM32残疾人辅助行走系统
  • Kotlin 基本介绍(二)
  • macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结
  • jQuery Mobile 方向改变事件
  • 01 基础request
  • Python进阶学习笔记(一)对象
  • vue的基本原理
  • linux下共享内存的3种使用方式
  • 串的存储实现方法(与链表相关)
  • centos7 源码编译安装faiss
  • 3、论文阅读:EnYOLO:一种基于图像增强的水下目标区域自适应实时检测框架
  • 【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用
  • Linux —— 网络基础(一)
  • 设计模式中工厂模式的C语言实现
  • python是什么语言写的
  • 一个基于Java SSM框架(Spring、SpringMVC、MyBatis)的沙县小吃点餐系统
  • 基于微信小程序的智慧物业管理系统
  • Codeforces Round 974 (Div. 3)