问:以下代码能否运行,为什么?
#include <stdio.h>
class A
{
public:
void doSome()
{
printf("doSome\n");
}
};
int main()
{
A* a = nullptr;
a->doSome();
return 0;
}答:可以,这里看似A是空的,调用doSome会崩溃,实际上非虚成员函数是编译期静态绑定,调用时仅传递 nullptr 作为 this 指针,而doSome内部未访问 this 指针,无空指针解引用操作。牢记两个崩溃边界:
- 非虚成员函数内部访问 this 指针(如访问成员变量),调用 nullptr 会崩;
- 虚成员函数无论是否访问 this 指针,调用 nullptr 都会崩(依赖虚函数表,需解引用)。