1、多型是c++三大特性之一,也是物件導向設計中乙個非常重要的概念。所謂多型性就是當
不同的物件接收到相同的訊息時所產生的不同的響應。
c++中虛函式的存在其實就是為了解決物件導向程式設計設計當中的多型問題,即通過基類的指標(或者是引用)
指向例項化
的派生類物件,從而通過基類的指標(或者是引用)呼叫派生類的成員函式,從而實現晚繫結(
不在編譯時根據函式名和引數來確定呼叫哪乙個函式,而是在執行時根據具體的環境來動態的確定)。
正是由於虛函式這種機制的存在,把基類的析構函式申明為虛析構函式就能夠解決通過釋放基類指標所造成的
記憶體洩露的問題。
2、沒有繼承關係時的虛函式表
1 #include 2以上**的輸出結果:3class
cbassclass
6virtual
void func2(void)
7virtual
void func3(void) 8};
910 typedef void (*pfnfun) (void
);11
12int main(void)13
2728
delete
pbase;
29return0;
30 }
從結果可以看出來,虛函式的入口位址在虛函式表當中是按照順序依次存放的,最後會以0作為結束標誌。
3、存在繼承關係的虛函式表(不存在覆蓋關係時)
1 #include 2以上**執行的結果:3class
cbassclass
6virtual
void func2(void)
7virtual
void func3(void) 8};
910class dclass :public
cbassclass
13virtual
void func5(void)
14};
1516 typedef void (*pfnfun) (void
);17
18int main(void)19
3536
delete
pbase;
3738
return0;
39 }
7 虛函式表中的結束標誌:0x0
8 cbassclass func1(void
)9 cbassclass func2(void
)10 cbassclass func3(void
)11 dclass func4(void
)12 dclass func5(void)
從上面的結果可以看出來,虛函式表中的函式位址是按順序存放的,派生類繼承了基類的虛函式表,然後
又在虛函式表中將自己的虛函式的函式位址存放在虛函式表中,先存放基類的虛函式後存放派生類的虛函式。
4、存在繼承關係的虛函式表(存在覆蓋關係時)
1 #include 2以上**執行的結果是:3class
cbassclass
6virtual
void func2(void)
7virtual
void func3(void) 8};
910class dclass :public
cbassclass
13virtual
void func3(void)
14virtual
void func4(void)
15virtual
void func5(void)
16};
1718 typedef void (*pfnfun) (void
);19
2021
int main(void)22
3839
delete
pbase;
4041
return0;
42 }
7 cbassclass func1(void
)8 dclass func2(void
)9 dclass func3(void
)10 dclass func4(void
)11 dclass func5(void)
從結果可以看出來,派生類中重寫了基類中的兩個虛函式,派生類繼承了基類的虛函式表之後,將虛函式表中
相應的兩個函式指標替換成了派生類自己的虛函式。其他的倒是沒什麼變化。
5、多繼承情況
示例**就不拷貝出來了,總之就是多重繼承的情況,會為每乙個基類建乙個虛函式表。派生類的虛函式放到
第乙個虛函式表的後面。
具體的請看這篇部落格:
C 虛函式與虛函式表
概念 虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的,簡稱為v table。學習虛函式的作用 理解 c 實現多型的機制 解決了繼承 覆蓋的問題。以下摘抄自 http www.cppblog.com xczhang archive 2008 01 2...
C 虛函式與虛函式表
多型性可分為兩類 靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的。兩張圖 簡單例子 1 inc...
虛函式與虛函式表
當類中有虛函式時,類的大小會多4個位元組 多出的這4個位元組是乙個位址,指向一張表,裡面儲存了所有虛函式的位址 虛函式表 class base virtual void function 2 virtual void function 3 class sub public base virtual ...