C++对象内存模型结构

2. 单一继承派生类对象内存结构

2.1 普通C++对象单一继承内存结构

class CObject { private: int mv1; long long mv2; char mv3;

public: int GetValue1() const; void SetValue1(int val); };

class CObjectA : public CObject { private: long long mv4; long long mv5;

public: long long GetValue4() const; void SetValue4(long long val); };

普通C++派生类对象内存结构

(1) 普通C++派生类对象内存结构中,仅包含父类和子类的成员变量。

(2) 成员变量在内存中按照先父类后子类的顺序逐个排列。

(3) 父类和子类对象指针,都指向该对象实例内存首地址。

2.2 带有虚函数的C++对象单一继承内存结构

class CObject2 { private: private: int mv1 {1}; long long mv2 {2}; char mv3 {3};

public: virtual ~CObject2();

1virtual long long GetValue2() const; 2virtual void SetValue2(long long val);

};

class CObject2A : public CObject2 { public: long mv4 {4}; long mv5 {5};

public: virtual long GetValue5() const { return mv5; } };

带虚方法的C++派生类对象内存结构

(1) 对象结构顶部多出一个虚表指针,指向CObject2A虚表的第三个字段。虚标指针后面,各个字段按照先父类后子类的顺序逐个排列。

(2) CObject2A的虚表结构是对CObject2虚表的扩展,并在内容上兼容CObject2虚表。

(3) CObject2A的虚表从第三个字段开始,依次是虚构函数指针(D1Ev和D0Ev),后面是各个要方法按照先弗雷后子类的顺序逐个排列。

(4) delete操作时,会调用D0Ev的虚构函数。D0Ev0首先调用D1Ev,然后释放当前内存。

(5) D1Ev除了执行CObject2A的析构逻辑外,还会调用基类CObject2的D1Ev析构方法,实现递归析构。

点赞
收藏

评论区

加载中...

相关推荐

c++头脑风暴-多态、虚继承、多重继承内存布局

本篇文章深入分析多态、虚继承、多重继承的内存布局以及实现原理。首先还是看一下思维导图:下面根据这个大纲一步一步的进行深入解析。一、没有虚函数时内存布局是怎样的1.没有虚函数时类的内存布局一个类没有虚函数的时候,其实就是结构体,它的内存布局就是按照成员变量的顺序来的。看如下代码:cppinclude<iostreamusingnamespaces

java中经常问到的面试题

1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例

DLL 函数中使用结构体指针作函数参数(C# 调用 C++ 的 DLL)

存在的问题:问题1:C与C同样定义的结构体在内存布局上有时并不一致;问题2:C中引入了垃圾自动回收机制,其垃圾回收器可能会重新定位指针所指向的结构体变量。解决方案:问题1方案:强制指定C、C结构体的内存布局,使其一致(两者都固定为:结构体的成员按其声明时出现的顺序依次布局,结构体成员的内存对齐为1字节对齐);为题

Go语言中通过结构体匿名字段实现方法的继承和重载

Go语言中的结构体可以定义匿名字段。Go语言中没有对象,但是结构体却有大量对象的功能。并且用匿名字段的确可以实现对象的继承和重载。packagemain import "fmt"  typeA struct{     x int }  typeA1 struct{

JVM系列【6】GC与调优1

JVM系列笔记目录虚拟机的基础概念class文件结构class文件加载过程jvm内存模型JVM常用指令GC与调优GC基础知识什么是垃圾​没有任何引用指向的一个对象或多个对象(循环引用)!file(https:

C++ 类与结构体 构造函数 详细相关理解整理

说到构造函数,通常是将讲对象创建时编译器自动调用构造函数为对象初始化,也可以说是分配内存空间。 学习了构造函数相对其中牵涉到的一些点作下大概的了解和学习,整理一下只是点。这里主要说下 类与结构体的差异/类与结构体包含继承关系时的构造调用/类的初始化列表/默认构造函数/拷贝构造函数以及牵涉到的相关内容结构体和类的区别