閱讀368 返回首頁    go 小米 go 小米6


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

  上一篇:go 智能家居項目(1):軟件開發流程
  下一篇:go Swift標識符和關鍵字