2012-08-22 65 views
4

嗨我與我的朋友討論了爲什麼沒有內聯虛函數。討論爲什麼沒有內聯虛函數

我的答案是內聯函數在編譯時,虛函數在動態時綁定。在編譯時,無法知道哪個函數會調用虛函數。所以內聯虛函數不是一個好主意。

但是,他說,這是不正確的。

他的回答是內聯函數沒有地址,所以在虛表中,沒有辦法放內聯函數的地址,所以沒有內聯虛函數。

我想知道三點:我的答案

  1. 是否正確?我想我的回答是對的。
  2. 沒有內聯函數沒有地址?我認爲它有地址;
  3. 即使內聯函數有一個地址,他的回答比我的 好?

非常感謝!

回答

7

我不喜歡任何一個答案。

inline函數是可以多次定義的函數(但定義必須匹配)。這就是爲什麼他們可以放在頭文件中。他們有一個地址就像任何其他功能。

virtual函數是可以被派生類重寫的函數。

你可以有,可以由派生類重寫的功能,並且可以很容易地超過一個定義:

struct foo { 
    virtual void f(); 
} 

inline void foo::f() {} 

這就是說,任何功能可以被內聯,即已經插入點的代碼的呼叫,而不是實際的呼叫。這並不妨礙以任何方式採取其地址。如果編譯器可以靜態解析它們,即使虛擬函數未標記爲inline也可以內聯。

相關問題