用virtual宣告類的成員函式稱之為虛函式
用於實現多型存在繼承關係,子類繼承父類
子類重寫了父類的virtual function
子類以父類的指標或者引用的身份出現
其中的關鍵就是兩點:
想要理解其中的結構,還是要從記憶體布局看起
下面都是用debug的方式,檢視其中的布局大小
一定要理解下面的四段**
1,普通類的記憶體布局
因為普通函式並不佔記憶體,所以此時物件a的並不顯示記憶體
2,虛函式類的記憶體布局
**:此時因為類內定義了虛函式,所以就有了乙個虛函式指標:_vfptr
這個函式指標指向的即為虛函式表,表內是兩個虛函式的位址
3,子類不重寫父類虛函式的記憶體布局
**:此時子類繼承了父類的虛函式,但是沒有重寫,因此子類的虛函式指標指向的表中依然存放的父類的虛函式,因此也可以看到,裡面的位址都是一樣的
4,子類重寫父類虛函式的記憶體布局
這個區域性變數中可以看到,重寫的函式虛函式表中的位址變了,沒重寫的函式,在虛函式表中的位址依然沒變。
上面四幅圖看懂就大概知道了虛函式表指標和虛函式表的關係了。
即當類中有虛函式時,就會自動產生乙個虛函式表指標,這個指標指向乙個虛函式表,表中就存放類中定義的虛函式
總結:
1,虛函式表指標
我們把物件首位址開始的4個位元組或8個位元組,這個位置我們稱之為虛函式表指標(可以新增點屬性看看位置)。它裡面包含乙個位址指向的就是虛函式表的位址
2,虛函式表
虛函式表裡面是一組位址的陣列(函式指標陣列),他所在的位置就是虛函式表指標裡面所儲存的位址,它裡面所包含的位址就是我們重寫了父類的虛函式的位址(沒有重寫父類的虛函式那麼預設的就是父類的函式位址)
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式指標和虛函式表
虛函式指標和虛函式表 虛函式表的定義 多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。如果乙個類中包含虛函式 virtual修飾的函式 那麼這個類就會包含一張虛函式表 vftbl 虛函式表儲存的每一項是乙個虛函式的位址。在乙個物件的記憶體布局中,指向這張虛函式表的指標 v...
虛函式表和虛函式表的指標
有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...