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#中继承对象的内存分配的主要内容,如果未能解决你的问题,请参考以下文章