有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。
虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項。
每個物件呼叫的虛函式都是通過虛函式表 指標來索引的,因此虛函式表指標的正確初始化是非常重要的。虛函式表指標應該在什麼時候、什麼地方初始化呢?
應該在建構函式中進行虛函式表的建立和虛函式表指標的初始化。根據建構函式的呼叫順序,在構造子類物件時,要先呼叫父類的建構函式,此時編譯器只看到了父類,並不知道後面是否有繼承者,所以它只初始化父類物件的虛函式表指標,該虛函式表指標指向父類的虛函式表;當執行子類的建構函式時,子類物件的虛函式表指標被初始化,指向自身的虛函式表。
#include using namespace std;
class a
virtual void g()
void h()
};class b : public a
};int main ()
上面的**中,當b類的物件b構造完成後,其內部的虛函式表指標被初始化為指向b類的虛函式表。
類的成員函式不占用類的空間,它們儲存在另外的乙個地方;只要類中有虛函式,這個類就會有乙個對應的虛函式表,而類會增加乙個指向這個虛函式表的指標,b繼承了乙個類a,所以需要乙個指向虛函式表的指標,32位系統下指標的大小為4位元組。如果繼承了n個類,則對應需要n個指標,分別指向對應的虛函式表。
[root@zhuliting ~]# g++ -o test test.cpp
[root@zhuliting ~]# ./test
sizeof(a):4
sizeof(b):4
f in b.
g in a.
h in a.
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式指標和虛函式表
虛函式指標和虛函式表 虛函式表的定義 多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。如果乙個類中包含虛函式 virtual修飾的函式 那麼這個類就會包含一張虛函式表 vftbl 虛函式表儲存的每一項是乙個虛函式的位址。在乙個物件的記憶體布局中,指向這張虛函式表的指標 v...
C 虛函式指標和虛函式表
含有虛函式的類 1.類的每個物件都有對應的自己的虛函式指標,虛函式指標在資料成員的最前面 2.同乙個類的不同例項共用乙份虛函式表,通過乙個虛函式指標指向該虛函式表 類的虛函式指標陣列 子類繼承父類 1.子類除了繼承父類的非靜態成員外,同時將父類的虛函式指標和虛函式表繼承下來 2.當子類重寫父類的虛函...