回覆列表
  • 1 # 手機使用者87851387267

    前面的回答都很靠譜的提到了重點:只有虛擬函式才會出現在虛擬函式表裡;而且虛擬函式表裡的項的順序並不保證跟類裡虛函式的宣告順序一致。編譯器實現和ABI有決定vtable layout的自由。C++的類的建構函式永遠不是虛的。它只應該在兩種場景使用,

    在new表示式中被呼叫:new表示式 = operator new呼叫 + 建構函式呼叫。這裡總是指定某個特定的類來new的,整個行為不會多型,所以也沒有讓它成為虛擬函式的必要性。不過確實有時候大家會希望根據構造的引數的不同而實質上選擇某個子類來new。這種需求常常透過工廠函式(factory function)來解決。被子類的構造器的初始化列表呼叫。C++裡類繼承關係是靜態確定的,子類永遠知道自己的基類是哪些,所以這個呼叫也不可能是虛的。解構函式則可能是虛的。跟構造與析構是對稱的過程,也正因為如此所以一個不會為虛而另一個可能為虛:構造:以new表示式為例,這是從一個非多型的資訊到一個可多型的指標的操作析構:以delete表示式為例,這是一個從可多型的指標要找到具體型別資訊的操作===========================================至於如何在程式裡找出建構函式和解構函式的地址。建構函式的地址是肯定不會出現在vtable裡的了。那咋搞?題主給問題打上了逆向工程的標籤,而且看來環境是MSVC,那如果目標檔案裡還有符號表的話,其實最直觀的辦法就是去符號表裡把建構函式的decorated name對應的地址項找出來。具體咋操作還得看題主到底是在什麼條件下需要找出這個地址來做什麼。

  • 中秋節和大豐收的關聯?
  • 太平公主和武則天,誰更值得同情?