2012-09-07 81 views
6
  1. 虛擬繼承使用vTable嗎?如果是或否,那麼它是如何實現的
  2. 虛擬繼承如何在內存中運行?
  3. 任何其它替代爲虛擬繼承

非常感謝的概念的說明。虛擬繼承如何工作?

+0

定義的實現。 – ildjarn

+0

它是依賴於實現的,在嚴格的技術術語中它是* Unspecified *,C++標準只描述了虛擬繼承必須提供的行爲,但沒有指定它應該如何實現。它作爲實現&他們不需要指定這個細節。他說,大多數(* read all known *)的編譯器都使用虛擬表和指針機制。 –

+1

說了上面的內容,不要認爲Q是無關緊要的,或者根本不是真正的Q.所有編譯器都使用類似的機制,雖然不需要知道實現細節,但知道它並不會讓人傷心。另外,如果有人抽出時間並且有說服力地回答,這個問題會被問到很多次,這會使得一個很好的C++ - faq。 –

回答

1

取決於編譯器,虛擬繼承以不同的方式實現。

1)是的,vc和gcc都使用vTable指針。但是vc有另一個指針ref作爲虛擬基址指針。

2)對於經典的虛擬繼承,如Left < Top;右邊<頂部;底部<左,右 堆棧應該是這樣的:

Left.vptr // -> to its vtable 

Left::element_in_left 

Right.vptr 

Right::element_in_right 

Bottom::element_in_bottom 

Top::element_in_top 

程序使用的vptr找到虛函數表,對海灣合作委員會,有一個虛擬的基地,在可行的偏移值。 vptr + base offset將會給出父地址。

3)我不確定你是什麼意思。有不同的方式在C++編譯器中實現它。其他語言有他們的方法來綁定函數。

+0

非常感謝!它似乎退出複雜!你能推薦我一些簡單的文章或書籍閱讀有關這個​​。 –

+0

@NayanaAdassuriya我已經閱讀了我的母語文章中的這些知識,所以我不熟悉英文書籍。我想你可以在谷歌搜索「C++內存佈局虛擬繼承」,有很多很棒的帖子。 – halfelf