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