首頁 >後端開發 >C++ >為什麼 C 語言中對 NULL 指標的非虛擬方法呼叫會成功,而虛擬方法呼叫會失敗?

為什麼 C 語言中對 NULL 指標的非虛擬方法呼叫會成功,而虛擬方法呼叫會失敗?

Patricia Arquette
Patricia Arquette原創
2024-12-13 10:03:10474瀏覽

Why Do Non-Virtual Method Calls on NULL Pointers Succeed While Virtual Method Calls Fail in C  ?

通過NULL 指針訪問類成員:探索非虛擬方法行為

問題:

為什麼C 中非虛擬方法呼叫NULL 指標會成功,而虛擬方法呼叫會使程式崩潰?

答案:

非虛擬方法行為:

當非在NULL 指標上呼叫虛擬方法時,編譯器產生直接呼叫該方法的實作的程式碼。這是透過向函數傳遞一個隱藏的「this」參數來實現的,在 NULL 指標的情況下,該參數不指向任何地方。但是,該方法本身不會嘗試存取物件的任何成員,因此程式碼避免了對 NULL 指標的取消引用並按預期運行。

正式定義:

然而,值得注意的是,在 NULL 指標上呼叫任何方法在 C 中都被正式視為未定義行為。這意味著編譯器可以對發生的情況做出任意選擇,包括允許程式明顯正確地運行。

虛擬方法行為:

虛擬方法呼叫需要 vtable查找以決定要呼叫哪個實作。 vtable 與實際物件關聯,因此在沒有關聯 vtable 的 NULL 指標上呼叫虛擬方法會導致崩潰。

物件分配:

所提供程式碼中的變數「foo」是分配在主函數堆疊上的局部變數。但是,它是用 NULL 指標初始化的,表示它沒有指向任何 Foo 類型的有效物件。

以上是為什麼 C 語言中對 NULL 指標的非虛擬方法呼叫會成功,而虛擬方法呼叫會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn