C++ 多態機製淺析
編譯時多態--函數重載
編譯後生成的中間代碼(如GCC生成的.o文件,此時還不是匯編語言)函數名字有變化,看下麵兩個例子。
void cc_show(const char*str) -> _Z7cc_showPKc
void cc_show(int x) -> _Z7cc_showi
大家可以看到,函數名其實不同,與返回值、函數名、參數有關。函數重載的規則就是參數的個數或種類必須不同,所以就不會有混亂了。
運行時多態--virtual動態綁定
編譯器在編譯的時候,會為含有虛函數的類和以/含有虛函數的類/為基類/的子類創建一個虛函數表(即virtual table),該表是一個一維數組,存放每個虛函數的地址。
那麼如何定位虛表呢?編譯器另外還為每個類的對象提供了一個虛表指針(即vptr),這個指針指向了對象所屬類的虛表。在程序運行時,根據對象的類型去初始化vptr,從而讓vptr正確的指向所屬類的虛表,因此在調用虛函數時,就能夠找到正確的函數。
虛函數表是一個類一個,而非一個對象一個。對象隻需要維護一個指向它所在類的虛函數表的指針即可。若一個類是多繼承,且其他父類也有虛函數,則這個類需要維護多個虛函數表。
最後更新:2017-04-03 05:39:49