在繼承爲什麼基類構造函數首先得到調用爲什麼不是派生的?爲什麼構造函數按相反順序調用?
5
A
回答
7
確保在派生類中使用基類的公共或受保護成員之前,它們已被正確初始化。
確切地說,派生類構造函數首先運行,並且隱式調用基類構造函數,作爲編譯器(假定爲缺省無參數構造函數)在派生類構造函數的主體中插入的第一條語句。
3
派生類是通過擴展基類創建的。應該確保在基類成員可以在派生類中進行擴展之前,它已被正確初始化。此外,派生類中初始化的成員不應被基類覆蓋。
2
什麼首先出生,父母或孩子?
3
考慮一下如果是相反的情況會發生什麼。我們來設想一個具有_id
值的用戶類。 0的_id
是一個代表「客人」賬戶的特殊值(忽略「特殊值」的問題,首先它們並不總是一個壞主意,其次這僅僅是一個例子)。 _id
也可以在施工後不能更改(這是有道理的,如果它可以改變它不再是一個標識符)。
public class User
{
private readonly int _id;
public User(int id)
{
_id = id;
}
public int ID
{
get { return _id; }
}
public bool IsGuest
{
get { return _id == 0; }
}
}
現在考慮一個Admin類,從它的子類。 Admin類的其中一個規則是客人永遠不能成爲管理員。這不變應在所有點強制執行的客戶狀態可以改變,在這種情況下只是在構造函數:
public class Admin : User
{
public Admin(int id)
:base(id)
{
if(IsGuest)
throw new SecurityException("Guest users cannot be admins.");
}
}
如果Admin
被User
以前建造的話,那就總是拋出此異常,作爲供試品將始終將0與0進行比較。如果我們對guest虛擬機有不同的特殊值,那麼它會更糟,並且即使在它應該時也不會拋出異常,並且會導致安全問題。
請記住,編寫Admin
類的人不需要知道User
如何工作,而不是記錄有關其公共和受保護接口的內容。他們可以通過添加他們自己的測試來確定id
是否爲零,但除了這是代碼的不必要重複之外,他們沒有理由爲什麼他們應該知道IsGuest
檢查是如何工作的,而且它可能會更加複雜比以上,也許可能是專有,混淆和無證。更一般地說,如果沒有「構建一個用戶」的概念作爲先發生的事情,那麼「構建一個管理員」的整個概念是沒有意義的,我們不能使一個更專門化的X沒有做一個X作爲先決條件。
相關問題
- 1. 爲什麼析構函數不按相反順序調用對象數組?
- 2. 爲什麼調用基構造函數?
- 3. 調用構造函數的順序
- 4. C++構造函數調用順序
- 5. 爲什麼我的構造函數被反覆調用?
- 6. 爲什麼在調用複製構造函數之前調用構造函數?
- 7. 成員構造函數和析構函數調用的順序
- 8. 調用繼承構造函數/析構函數的順序,C++
- 9. 爲什麼predict_proba函數以相反的順序打印概率?
- 10. 首先調用虛擬基類的構造函數,然後按順序調用其他類的構造函數
- 11. 爲什麼調用複製構造函數而不是移動構造函數?
- 12. 反思 - 調用構造函數參數
- 13. 按順序調用函數
- 14. 構造調用順序(C++)
- 15. 虛擬繼承中構造函數調用的順序是什麼?
- 16. 調用父類和子類的靜態構造函數的順序是什麼?
- 17. 構造函數與構圖調用順序
- 18. 爲什麼Swift構造函數使用命名參數調用?
- 19. 爲什麼構造函數不是構造函數?
- 20. 調用構造函數時,反序列化JSON反對
- 21. 什麼是構造函數解析順序?
- 22. 爲什麼使用線程來調用類的構造函數?
- 23. 爲什麼析構函數調用的不止是構造函數?
- 24. Java:通過構造函數調用構造函數,有什麼意義?
- 25. 爲什麼基礎移動構造函數的顯式調用實際上調用基礎構造函數?
- 26. Matlab OOP中的構造調用順序是什麼?
- 27. 用Jackson反序列化JSON - 爲什麼JsonMappingException「沒有合適的構造函數」?
- 28. 範圍按相反順序?
- 29. 在Scala反射中,爲什麼構造函數params隱藏getters?
- 30. 爲什麼移動構造函數不被調用?
請參閱:http://stackoverflow.com/questions/140490/base-constructor-in-c-which-gets-called-first,http://stackoverflow.com/questions/1882692/c-constructor-execution -訂購 – 2010-10-04 09:24:35