C#中继承对象的内存分配

Posted

技术标签:

【中文标题】C#中继承对象的内存分配【英文标题】:Memory allocation for object in inheritance in C# 【发布时间】:2018-06-15 07:45:10 【问题描述】:

我对在继承的情况下如何完成对象分配感到困惑 考虑下面的代码。

class Base


class Derived : Base

// some code

如果我们这样做,则从 main 开始

Derived d = new Derived();

Base b = new Derived();

这两种情况在堆中的内存分配是多少。 派生对象是在基础对象内部还是它们都在彼此旁边

【问题讨论】:

由于两个对象都是用“new”创建的,它们在内存中会有不同的地址。 将 b 声明为 Base 的事实并没有改变对象是什么,只是改变了它的处理方式。 我认为这与继承无关。如果您创建了Derived 的实例并将其分配给接口类型的变量,则同样适用。它仍然是Derived 【参考方案1】:

两个对象的内存分配看起来完全一样。两个对象都属于同一类型Derived

当然,每个对象都会在堆上分配到自己的空间中。

创建对象时重要的是用于构造对象的类(类型),而不是存储对象的引用类型。

每个对象都作为完整的实体存在,但您可以将其视为继承自它的所有类的所有部分的摘要。在某种程度上Derived 对象实例包含Base 对象实例内部。反之亦然。

【讨论】:

【参考方案2】:

在这两种情况下,您都实例化了具体 Derived 类的对象,因此两者的内存占用量相同 - 您使用 Base 和 Derived 类的引用来引用它们,但您在两个 cade 中实例化 Derived 类。

但至于为您的问题提供一般性答案 - 是的,派生类的内存实例包含其基类的所有成员。

【讨论】:

以上是关于C#中继承对象的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Qt 中继承 QWidget 类时出现内存泄漏

C#中继承类为啥可以通过属性访问基类的私有字段。

C#中字符串的内存分配与驻留池

在 C# 中进行大量、快速和频繁的内存分配期间避免 OutOfMemoryException

友谊得到继承??奇怪的

C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配