2010-09-17 121 views

回答

2

虛擬基座首先被初始化,因爲任何基類的子集都可能繼承它。

另一種方法是嘗試讓它們協調,以便第一個繼承初始化虛擬基礎。這將是笨拙和不可預測的。

+0

+1 - 打敗我吧。 – ChrisBD 2010-09-17 06:40:10

+0

「虛擬基礎首先被初始化,因爲基類的任何子集都可能從中繼承。」 。基類的子集?我沒有明白... !! – Jagan 2010-09-17 07:23:09

+0

@Jagan:一個類可以有幾個基礎,並且它們可以在一個層次結構中有基礎。無論在該層次中使用虛擬基地多少次,最終派生對象中只有一個虛擬基地的副本。 – Potatoswatter 2010-09-17 07:31:31

0

想象一下帶有虛擬基類VB的經典菱形多繼承場景。所述繼承圖這個看起來像這樣

VB  VB 
|  | 
|  | 
D1  D2 
\ /
    \/
    DD 

對象圖(表示基類的子對象和它們之間的關係)是這樣的:

VB 
/\ 
/ \ 
D1  D2 
\ /
    \/
    DD 

通常說話(並且將虛擬基礎留在圖片之外),類被構造爲基類派生的,所以任何基類子對象必須在派生類被創建之前被創建。對於我們的具體示例,這意味着:

當創建一個DD對象時,需要首先創建兩個類型爲D1D2的子對象。然而,爲了創建它們,需要首先創建它們的基類子對象...這是有問題的,因爲它們共享相同的子對象。

解決方案是先創建虛擬基類子對象,然後創建其餘的。

相關問題