一、類的大小
乙個類中,如果什麼都沒有,那麼它所佔的位元組為1,如果在類中新增了乙個函式(非虛函式),那麼它的大小還是1,而如果是虛函式,建立物件時會多乙個虛函式表指標__vptr,那麼對於32位系統來說是4位元組,對於64位系統來說是8位元組。
二、虛函式
類中函式前有virtual這類關鍵字,則此函式為虛函式。
class
base
base::
~base()
;
三、虛函式表
base類中存在虛函式,a繼承base類,那麼這兩個類都存在乙個虛函式表。
classa:
public base
虛函式表是乙個指標陣列,其元素是虛函式的指標,每個元素對應乙個虛函式的函式指標。需要指出的是,普通的函式即非虛函式,其呼叫並不需要經過虛函式表,所以虛函式表的元素並不包括普通函式的函式指標。
虛函式表內的條目,即虛函式指標的賦值發生在編譯器的編譯階段,也就是說在**的編譯階段,虛函式表就可以構造出來了。
四、虛表指標
虛函式表是屬於類的,而不是屬於某個具體的物件,乙個類只需要乙個虛函式表即可。同乙個類的所有物件都使用同乙個虛函式表。
為了指定物件的虛函式表,物件內部包含乙個虛函式表的指標,來指向自己所使用的虛函式表。為了讓每個包含虛函式表的類的物件都擁有乙個虛函式表指標,編譯器在類中新增了乙個指標,*__vptr,用來指向虛函式表。這樣,當類的物件在建立時便擁有了這個指標,且這個指標的值會自動被設定為指向類的虛函式表。
虛函式表指標以及虛函式表建立時機
一 虛函式表指標 vptr 建立時機 vptr跟著物件走,所以物件什麼時候建立出來,vptr就什麼時候建立出來,也就是執行的時候。當程式在編譯期間,編譯器會為建構函式中增加為vptr賦值的 這是編譯器的行為 當程式在執行時,遇到建立物件的 執行物件的建構函式,那麼這個建構函式裡有為這個物件的vptr...
c 類大小(涵蓋繼承 虛繼承 虛函式表)
涉及到c 中求類大小時需要特別注意一下幾點 為類的非靜態成員資料的型別大小之和 有編譯器額外加入的成員變數的大小,用來支援語言的某些特性 如 指向虛函式的指標 虛繼承 多重繼承 為了優化訪問效率,進行的邊緣調整 與類中的建構函式,析構函式以及其他的成員函式無關 5.私有繼承,會去繼承之前的私有成員變...
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...