2011-08-16 149 views
5

這裏http://www.parashift.com/c++-faq-lite/multiple-inheritance.html部[25.14]表示繼承層次結構:構造&析構函數執行序列

要執行的第一個構造函數是虛擬基類在層次結構中的任何地方。

我試着用下面的程序來驗證:

  A (pure virtual) 
      | 
      B 
      | 
      C 
(virtual)/ \ (virtual) 
     E  D 
     \ /
      F 
      | 
      G (pure virtual) 
      | 
      H 

每個類都有一個c'tor和虛擬D'TOR。輸出如下:

A 
B 
C 
E 
D 
F 
G 
H 
~H 
~G 
~F 
~D 
~E 
~C 
~B 
~A 
Press any key to continue . . . 

但是根據引用虛擬基類的構造函數應該先執行。

我究竟是什麼錯誤?

編輯:要清除我的問題,根據我的理解,這種行爲與基類是否爲虛擬無關。但引用堅持虛擬基類。我清醒還是有什麼可疑的?

謝謝。

+0

請提供您使用的代碼以獲得更準確的答案。 – amit

+0

@amit,這裏不需要代碼。預期這種行爲... – eran

回答

3

如果虛擬基類繼承自的類不是先構建的,則無法構造虛擬基類。因此,在你的情況下,非虛擬基類被構建,因爲虛擬基類依賴它們:C不能構造,直到AB。因此,AB確實是在C之前構建的,儘管C實際上是繼承的。

+1

這是在任何scenerio。爲什麼這個短語被添加到層次結構中的任何地方? – Azodious

+1

@有趣,C++ FAQ很棒,但我想在這種情況下,缺乏進一步的解釋實際上可能會有些誤導。虛擬基礎類首先在任何地方構建,但是構建它們涉及構建它們的基礎,就像在任何情況下一樣。沒有其他的方法可以工作,因爲類必須能夠依賴其初始化的基礎。 – eran

+0

好的...清除它。謝謝。 – Azodious