通过 NULL 指针访问类成员
尽管被声明为指向 Foo 类型实例的指针,但 foo 变量被初始化为0,使其成为空指针。这可能看起来违反直觉,因为访问空指针的成员通常是未定义的行为。然而,某些情况允许这种行为。
非虚拟方法调用
尽管有空指针,但非虚拟方法 say_hi() 仍被成功调用,因为它不是虚拟方法。虚拟方法需要一个有效的对象来根据对象的类型确定调用哪个函数。另一方面,非虚方法具有预定的函数地址,编译器使用该地址来生成直接函数调用指令。
具体来说,编译器生成相当于以下内容的代码:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
由于 say_hi() 函数不引用 this 指针,因此它无需取消引用可能为 null 的指针指针。
对象分配
foo 变量是主函数中的局部变量,因此它分配在函数的堆栈上。作为指针变量,它所指向的实际对象并不是在这里分配的。 null 值表示指针没有引用有效的对象。
以上是为什么在 NULL 指针上调用非虚拟方法不会导致未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!