1
A
回答
2
目的是创建一次性:对于域的空间是基于知识的分配,对字段中X
宣布,Y
,Z
的总和(和任何object
开销,隐含X : Y : Z
需求空间基地Z
)。这些字段是继承的,因此X
是 a Z
。
它们是从下往上初始化的,因为即构造函数是如何工作的;如果我们写:
class A : B
{
private int _a = 1;
public A() { Console.WriteLine("A"); }
}
class B {
private int _b = 1;
public B() { Console.WriteLine("B"); }
}
然后我们得到(对于B
):
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldc.i4.1
L_0002: stfld int32 B::_b
L_0007: ldarg.0
L_0008: call instance void [mscorlib]System.Object::.ctor()
L_000d: ldstr "B"
L_0012: call void [mscorlib]System.Console::WriteLine(string)
L_0017: ret
}
和A
:
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldc.i4.1
L_0002: stfld int32 A::_a
L_0007: ldarg.0
L_0008: call instance void B::.ctor()
L_000d: ldstr "A"
L_0012: call void [mscorlib]System.Console::WriteLine(string)
L_0017: ret
}
注意到它运行其自己的调用基构造函数前本地构造函数代码。还要注意,即使在那之前,字段初始化器也会出现。
3
让我们有一些例子:
class A
{
int x;
int y;
}
class B: A
{
int c;
}
如果您创建的A
一个新实例,一块内存是在堆上创建。该内存将占用8个字节; 4个字节为x
,4个字节为y
。 (我知道,更多的内存是为它的类型保留的,等等,但我会在这个范围之外)。
如果您创建B
的新实例,则会创建一个内存块。不是两个,只有一个。所以没有任何儿童实例或任何。这通过在长度为12个字节(4个字节为x
,4个字节用于y
和4个字节为新字段z
。
当在堆上创建一块内存一块内存意愿,就总是充满零。因此,所有fieds都会有自己的缺省值,在这种情况下0
。
如果这两个类将有一个公共的无参数的构造函数,这些构造函数都会被自动调用。
class A
{
int x;
int y;
public A()
{
x = 1; y = 2;
}
}
class B: A
{
int c;
public B()
{
z = 3;
}
}
当B
一个新的实例CRE被调用,B
的构造函数被调用。构造函数的第一件事是调用构造函数A
。 A
将其字段设置为x
和y
至1
和2
。然后程序返回B
的构造函数,它将初始化z
的值为3
。
的B
构造也可以被写成(表明B
呼吁其基础A
的构造函数):
public B()
: base()
{
z = 3;
}
0
一个简单的解释,这是思继承作为复印机
所以,让我们现在要创建的子对象定义2类
class Base
{
}
class Child : Base
{
}
。孩子有自己的领域,但由于它从基地继承,它必须去复制其基类的所有领域,并因此自动创建。
类是对象的模板,继承只不过是可创建新模板时可以附加的可重用模板。
相关问题
- 1. 从基类实例化派生对象
- 2. 如何自动派生DataKinds派生类型的Typeable实例?
- 3. 实例化派生自MonoBehaviour的类
- 4. 基类的实例如何保存派生类的实例?
- 5. 如何实例化派生自抽象类的类
- 6. 从基类返回派生类实例
- 7. 如何从基类的实例初始化派生类的实例?
- 8. 在基类中使用“new this.GetType()”来实例化派生类
- 9. 来自类实例的派生类?
- 10. 在C++中实例化派生类型
- 11. 实例化派生类对象,其基类ctor是私人的
- 12. 如何在使用派生类的实例时序列化基类?
- 13. 如何在一个向量中管理基类实例和派生类实例?
- 14. 基类中派生的实例
- 15. 保存从基类派生的实例
- 16. 如何从派生类获取基类实例
- 17. C++如何从派生类实例调用模板化的基类函数
- 18. 如何实例化一个基类,然后将其转换为派生类?
- 19. 使用在基类派生类,而派生类的基类
- 20. 从基类实现派生类的自动属性?
- 21. 在C#中如何调用派生类实例中已在派生类中重写的基类方法
- 22. 在基类中创建派生类实例
- 23. 如何在Python中一次定义和实例化派生类?
- 24. 尝试在基类之外创建派生类的实例时出错
- 25. 从基类实例创建派生类实例而不知道类成员
- 26. 在C#中使用基类和派生类实例化数组中的对象#
- 27. 了解在基类构造函数中实例化哪个派生类
- 28. Python派生类在派生类上自动运行类方法
- 29. 模板化基类中的派生类
- 30. 我可以使用对派生类实例的基类引用初始化派生类引用吗?
它并不“复制”所有的字段 - 它继承了它们;他们是*相同的字段* – 2013-05-09 09:18:55
但是不是继承了仅仅复制基类模板的行为? – Anand 2013-05-09 09:19:55
不会。这会使私人字段可用 – 2013-05-09 09:21:19