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