1. 程式人生 > >虛擬函式的底層實現機制?

虛擬函式的底層實現機制?

在說這個問題之前,先解釋下為什麼在C++程式中呼叫被C編譯器編譯的函式要加extern "c"宣告?                                                      答:解釋這個道理就和為什麼C++可以支援函式過載而C語言不支援函式過載一樣。函式經過編譯系統的翻譯成組合語言,C編譯的函式名和彙編得到的函式名是一模一樣的,比如說在C語言中定義一個fun()函式,經過編譯器編譯之後在底層中的函式名還是_fun()。而C++中,函式名和得到的彙編代號有很大的區別,函式名一樣,得到的函式代號絕對不一樣,為了區分,編譯器會把函式名和引數名,引數型別合在一起,作為彙編代號,這樣C++就支援函式過載了!

為什麼要加extern c?

如果C++呼叫C,如fun(),則呼叫名就不是C的翻譯結果_fun,而是帶有引數資訊的一個名字,因此就不能呼叫到fun(),為了解決這個問題,加上extern "C"表示該函式的呼叫規則是C的規則,則呼叫時就不使用C++規則的帶有引數資訊的名字,而是_fun,從而達到呼叫C函式的目的。