虛擬繼承、虛函數學習總結

 

一、虛函數。

其實是比較簡單的,它的存在就是爲了給子類繼承,並且提供多個接口,所謂多個接口,就是多態性,它的主要特點就是父類的指針可以指向子類的對象,這樣的話,在繼承上會有好處。例如,某個父類有多個子類,在不知道會調用哪一個子類對象的情況下,可以定義一個父類的指針f,這樣就實現了所謂的“接口”功能,在知道了要使用哪一個子類的時候,就直接把父類的指針f指向那個子類的對象,以後的操作都是採用父類的指針f,這樣顯然就有優點了,可以把對子類的操作封裝起來,跟它使用哪一個子類沒有關係了,因爲在被封裝起來的操作裏面操作的對象是父類的指針f,然後這些被封裝的操作就提供了一個“接口”,要用哪一個類的對象,就把那一個類對象的地址給父類的指針f

二、虛函數非虛擬繼承

CSDN的博客上有一篇文章《C++虛函數表解析》,作者:陳皓

網址:http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx

說的是虛函數在內存中的格局,講得很好理解。通過vs2005調試查看內存也是一樣的。就是虛函數表。

三、虛擬繼承。

CSDN的博客上有一篇文章《C++對象內存佈局》,作者:陳皓

網址http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx

裏面講述了c++虛函數的各種繼承的內存佈局,講得非常詳細,大部分的內容都很容易看懂,但是在講解虛擬繼承上還有一點不足,就是虛函數的虛擬繼承漏了一點內容,虛基函數表(vbtbl)的相關內容。

另一篇文章寫得很好,也是CSDN博客上的,《c++虛繼承對象的內存佈局》

網址:http://blog.csdn.net/BlueDog/archive/2009/10/22/4711169.aspx

在《C++對象內存佈局》有一個名詞叫做“鑽石型虛擬多重繼承”,之前不知道該怎麼稱呼這種繼承,畫成圖,它們的形狀就像棱形,一個基類產生兩個子類,兩個子類又同時被另一個“孫類”虛擬繼承,最簡單的虛擬繼承就是這樣子。

1、              沒有涉及虛函數的虛擬繼承。如果不管內部如何實現,簡單的說就是“孫類”只拷貝一次基類,如果涉及到內存佈局,那就必須通過debug,查看執行時的內存,《c++虛繼承對象的內存佈局》說到了這一點。通過內存查看“孫類”對象的地址,這個地址就相當於有虛函數的虛擬繼承的“Virtual Base Class Table”簡稱“VBTBL”,當然名稱可能有點問題,因爲它只是包含用來尋找虛基類表的偏移值,而不是虛基類表的指針。在沒有虛函數的情況下,它保存的內容同樣有兩項(因爲只有一個基類),第一項爲0,因爲沒有虛函數,第二項爲本地址相對於基類的偏移值。從“孫類”的內存中發現,基類的內容放在在最後面,這也跟有虛函數的時候一樣。可能是爲了跟有虛函數的時候統一,格式是一樣的,這樣的話,在沒有虛函數的時候,有些是沒有用的,如B子類也有個類似於“VBTBL”的東西,如果沒有理解錯的話,它應該是沒用的,訪問基類的時候用不着它。在查看內存的時候還發現了一些現象,內存裏面沒有函數的地址,只有變量空間,這個大概就是非虛函數跟虛函數的不同吧。通過查看內存可以很好的理解底層的東西。

2、              含有虛函數的虛擬繼承。這就涉及到了虛函數表、虛基類、VBTBL。《c++虛繼承對象的內存佈局》裏面說得很詳細,那個“孫”類對象的內存結構圖看起來非常的明確,我在vs2005裏面查看,完全一樣。

3、              總結:有虛擬繼承的“孫”類的對象的內存格局是這樣的,被虛擬繼承的基類放在最後,子類按順序放在基類的前面。子類的對象的內存格局,基類也是放在最後。虛擬繼承的每一個類都有“VBTBL”之類的東西。




         網絡上有很多的好文章,學習起來非常的快,虛函數的知識,前幾天還沒有涉及到底層的東西,理解也沒有那麼深刻,通過網絡上查找高手的文章,再加上自己的驗證,很多東西都理解了。查找資料很重要,如果沒有資料可以看,自己不知道要搞多久才知道底層的知識原來是這樣。關於這方面的書應該是《Inside the C++ Object Model》,只是纔剛開始學,很多基礎還要加強,另外時間也是個問題。

     好像有一個觀點:學了點知識,就要及時總結,這樣纔算學會了。大概就是這樣子。作爲一個菜鳥,有些內容的表達上,可能會有點問題。

   JUST DO IT。。

2010.2.1

燭秋

2010.8.21更新:

發現這篇文章理解得太淺了,也表達得不夠清晰,重寫理解總結如下:

http://www.cnblogs.com/cswuyg/archive/2010/08/20/1804113.html

轉自:

http://hi.baidu.com/%D6%F2%C7%EF/blog/item/826d38ff13c32e3a5d6008e8.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章