透過NULL 指標存取類別成員
儘管被宣告為指向Foo 型別實例的指針,但foo 變數初始化為0,使其成為空指針。這可能看起來違反直覺,因為存取空指標的成員通常是未定義的行為。然而,某些情況允許這種行為。
非虛擬方法調用
儘管有空指針,但非虛擬方法 say_hi() 仍被成功調用,因為它不是虛擬方法。虛擬方法需要一個有效的物件來根據物件的類型確定要呼叫哪個函數。另一方面,非虛方法具有預定的函數位址,編譯器使用該位址來產生直接函數呼叫指令。
具體來說,編譯器產生相當於以下內容的程式碼:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
由於say_hi() 函數不引用this 指針,因此它無需取消引用可能為null 的指針指針。
物件分配
foo 變數是主函數中的局部變量,因此它分配在函數的堆疊上。作為指標變量,它所指向的實際物件並不是在這裡分配的。 null 值表示指標沒有引用有效的物件。
以上是為什麼在 NULL 指標上呼叫非虛擬方法不會導致未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!