gpt4 book ai didi

c# - 如何在派生类之前自动实例化基类

转载 作者:行者123 更新时间:2023-12-04 00:43:13 25 4
gpt4 key购买 nike

我想知道当我们创建派生类的实例时,基类是如何在派生类之前自动实例化的。

我只想知道基类的成员是如何占用内存的,子类的引用是如何访问它们的。

最佳答案

让我们举几个例子:

class A
{
int x;
int y;
}

class B: A
{
int c;
}

如果您创建一个新的 A 实例,就会在堆上创建一 block 内存。该内存将占用8个字节; x 为 4 个字节,y 为 4 个字节。 (我知道,为它的类型等保留了更多的内存,但我会把它留在这个范围之外)。

如果您创建一个新的 B 实例,则会创建另一 block 内存。不是两个,只有一个。所以没有子实例或任何东西。这 block 内存的长度为 12 个字节(x 为 4 个字节,y 为 4 个字节,新字段 z 为 4 个字节。

当在堆上创建一 block 内存时,它总是被零填充。所以所有字段都将具有默认值,在本例中为 0

如果两个类都有一个公共(public)的无参数构造函数,这些构造函数将被自动调用。

class A
{
int x;
int y;
public A()
{
x = 1; y = 2;
}
}

class B: A
{
int c;
public B()
{
z = 3;
}
}

B 的新实例被创建时,B 的构造函数被调用。构造函数做的第一件事是调用A 的构造函数。 A 会将其字段 xy 设置为 12。然后程序返回到 B 的构造函数,他将用值 3 初始化 z

B 的构造函数也可以写成(以表明 B 正在调用其基类 A 的构造函数):

    public B()
: base()
{
z = 3;
}

关于c# - 如何在派生类之前自动实例化基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com