有人可以解釋它爲什麼如此嗎?首先調用虛擬基類的構造函數,然後按順序調用其他類的構造函數
0
A
回答
2
虛擬基座首先被初始化,因爲任何基類的子集都可能繼承它。
另一種方法是嘗試讓它們協調,以便第一個繼承初始化虛擬基礎。這將是笨拙和不可預測的。
0
想象一下帶有虛擬基類VB
的經典菱形多繼承場景。所述繼承圖這個看起來像這樣
VB VB
| |
| |
D1 D2
\ /
\/
DD
而對象圖(表示基類的子對象和它們之間的關係)是這樣的:
VB
/\
/ \
D1 D2
\ /
\/
DD
通常說話(並且將虛擬基礎留在圖片之外),類被構造爲基類派生的,所以任何基類子對象必須在派生類被創建之前被創建。對於我們的具體示例,這意味着:
當創建一個DD
對象時,需要首先創建兩個類型爲D1
和D2
的子對象。然而,爲了創建它們,需要首先創建它們的基類子對象...這是有問題的,因爲它們共享相同的子對象。
解決方案是先創建虛擬基類子對象,然後創建其餘的。
相關問題
- 1. 構造函數中的調用基構造函數和其他構造函數
- 2. 爲什麼基類的構造函數首先調用?
- 3. 確定一個構造函數調用其基類的構造
- 4. Move構造函數調用基類移動構造函數
- 5. 爲什麼不首先調用基類構造函數
- 6. 如何在其他構造函數中調用構造函數?
- 7. 調用基類和派生構造函數的順序
- 8. 未調用基類構造函數?
- 9. 基類構造函數在派生類構造函數之前真的調用
- 10. 從不同類的構造函數調用構造函數
- 11. 調用構造函數的順序
- 12. 在父構造函數之前調用子類構造函數
- 13. 由其他調用構造函數
- 14. 成員構造函數和析構函數調用的順序
- 15. C++構造函數調用順序
- 16. 繼承虛基類的構造函數
- 17. SyntaxFactory使用調用基類構造函數生成構造函數
- 18. 內部類的構造函數調用
- 19. Scala:調用超類的構造函數
- 20. 調用模板類的構造函數
- 21. 在C++中的一些其他指令後調用基類的構造函數
- 22. Java:如何調用子類構造函數內的超類構造函數?
- 23. C++ - 構造函數,其中使用的參數基類'構造函數
- 24. 在其他類的構造函數使用基類C#
- 25. 與其他類常數值調用構造函數
- 26. Java - 擴展似乎是調用其他類的構造函數
- 27. 構造函數調用vb.net其他構造一拉C#
- 28. 調用其他構造函數的構造函數:任何性能問題?
- 29. 如何從c#中的構造函數調用其他構造函數?
- 30. 從構造函數調用虛擬函數
+1 - 打敗我吧。 – ChrisBD 2010-09-17 06:40:10
「虛擬基礎首先被初始化,因爲基類的任何子集都可能從中繼承。」 。基類的子集?我沒有明白... !! – Jagan 2010-09-17 07:23:09
@Jagan:一個類可以有幾個基礎,並且它們可以在一個層次結構中有基礎。無論在該層次中使用虛擬基地多少次,最終派生對象中只有一個虛擬基地的副本。 – Potatoswatter 2010-09-17 07:31:31