一般是對于基類的某個成員函數
<code>vitrual void function()</code>
當基類的成員函數被指定為虛函數後,派生類的同名同參函數一般也被認為是虛函數,但是為了程式的清晰,一般也加上vitrual
為了解決一個基類的指針當指向派生類對象時可以調用派生類對象的函數而不需要再轉化為派生類指針
這與派生類指針指向派生類對象,調用其成員函數不同
基類指針也隻能調用自己的成員函數不能調用派生類的非虛函數
在C++的标準規格說明書中說到,編譯器必需要保證虛函數表的指針存在于對象執行個體中最前面的位置(這是為了保證正确取到虛函數的偏移量)
假設我們有這樣的一個類:
按照上面的說法,我們可以通過Base的執行個體來得到虛函數表。 下面是實際例程:
/這裡的一點争議的個人看法/
原文認為<code>(int*)(&b)</code>是虛表的位址,而很多網友都說,(包括我也認為):<code>(int *)*(int*)(&b)</code>才是虛表位址
而<code>(int*)*((int*)*(int*)(&b))</code>; 才是虛表第一個虛函數的位址。
其實看後面的調用<code>pFun = (Fun)*((int*)*(int*)(&b)); </code>就可以看出,<code>*((int*)*(int*)(&b));</code>轉成函數指針給pFun,然後正确的調用到了虛函數virtual void f()。
與類大小有關的因素:普通成員變量,虛函數,繼承(單一繼承,多重繼承,重複繼承,虛拟繼承)
與類大小無關的因素:靜态成員變量,靜态成員函數及普通成員函數
虛函數表指針(vfptr)(可能有多個,因為多繼承)+成員變量(基類的+自己的)+記憶體對齊+虛拟繼承的基類指針(vbptr)