通過NULL 指針訪問類成員:探索非虛擬方法行為
問題:
為什麼C 中非虛擬方法呼叫NULL 指標會成功,而虛擬方法呼叫會使程式崩潰?
答案:
非虛擬方法行為:
當非在NULL 指標上呼叫虛擬方法時,編譯器產生直接呼叫該方法的實作的程式碼。這是透過向函數傳遞一個隱藏的「this」參數來實現的,在 NULL 指標的情況下,該參數不指向任何地方。但是,該方法本身不會嘗試存取物件的任何成員,因此程式碼避免了對 NULL 指標的取消引用並按預期運行。
正式定義:
然而,值得注意的是,在 NULL 指標上呼叫任何方法在 C 中都被正式視為未定義行為。這意味著編譯器可以對發生的情況做出任意選擇,包括允許程式明顯正確地運行。
虛擬方法行為:
虛擬方法呼叫需要 vtable查找以決定要呼叫哪個實作。 vtable 與實際物件關聯,因此在沒有關聯 vtable 的 NULL 指標上呼叫虛擬方法會導致崩潰。
物件分配:
所提供程式碼中的變數「foo」是分配在主函數堆疊上的局部變數。但是,它是用 NULL 指標初始化的,表示它沒有指向任何 Foo 類型的有效物件。
以上是為什麼 C 語言中對 NULL 指標的非虛擬方法呼叫會成功,而虛擬方法呼叫會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!