內聯虛擬函式真的是神話嗎?
在程式碼審查中,評論「虛擬函數不需要內聯」引發了以下問題:使用內聯虛函數。儘管它們具有潛在的好處,但對其實用性仍有疑問。
在直接在物件上呼叫函數的場景中,內聯虛擬函數可能看起來比較合適。然而,有人可能想知道,如果使用物件來呼叫方法,為什麼還要使用虛擬函數。
下面的程式碼片段舉例說明了這個問題:
class Temp { public: virtual ~Temp() {} virtual void myVirtualFunction() const { cout << "Temp::myVirtualFunction" << endl; } }; class TempDerived : public Temp { public: void myVirtualFunction() const { cout << "TempDerived::myVirtualFunction" << endl; } }; int main() { TempDerived aDerivedObj; // Compiler expands virtual functions aDerivedObj.myVirtualFunction(); // Object type for Temp* is known Temp* pTemp = &aDerivedObj; pTemp->myVirtualFunction(); return 0; }
雖然編譯器可以內聯虛函數當已知物件的確切類別(例如,aDerivedObj)時調用,而當透過指標存取物件時則不能這樣做(pTemp)。
這個限制提出了一個問題:內聯虛函數是否應該避免,因為它們的擴展經常受到限制?
答案:
虛擬函數在某些情況下可以內聯,如 C FAQ中所述:
“內聯虛擬調用唯一可以被內聯是指編譯器知道作為虛函數調用目標的對象的“確切類”,只有當編譯器具有實際對象而不是對象的指針或引用時,才會發生這種情況。
以上是內聯虛擬函數是一個神話,還是只是被誤解了?的詳細內容。更多資訊請關注PHP中文網其他相關文章!