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

5
我对继承中对象的分配方式感到困惑。请考虑以下代码:
class Base
{
}
class Derived : Base
{
// some code
}

并且如果我们从主函数开始做
Derived d = new Derived();

并且

Base b = new Derived();

堆上的两种情况的内存分配是什么?派生对象在基对象内部还是它们两者并排?


1
由于两个对象都是使用“new”创建的,它们在内存中将具有不同的地址。 - Lavinia N.
2
你将b声明为“Base”并不会改变对象的本质,只是改变了对待它的方式。 - Chris
我认为这与继承没有真正的关系。如果您创建了Derived的实例并将其分配给接口类型的变量,情况也是如此。它仍然是一个Derived - Fildor
2个回答

7

两个对象的内存分配看起来完全相同。这两个对象都是相同类型的Derived

当然,每个对象将在堆上占用自己的空间。

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

每个对象都存在作为完整实体,但您可以将其视为从所有继承类中继承的所有部分的摘要。在某种程度上,Derived对象实例包含Base对象实例内部。而不是反过来。


2
在这两种情况下,您都需要实例化具体的Derived类对象,因此两者的内存占用量是相同的 - 您可以使用Base和Derived类的引用来引用它们,但在这两种情况下都需要实例化Derived类。
但是,对于您的问题提供一个通用答案 - 是的,在内存中,派生类的实例包含其基类的所有成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接