考虑以下两段代码:
#include <iostream>
class A {
public:
void fun(){
printf("Hello world\n");
}
};
int main()
{
A* a = nullptr;
a->fun();
return 0;
}
#include <iostream>
class A {
public:
virtual void fun(){
printf("Hello world\n");
}
};
int main()
{
A* a = nullptr;
a->fun();
return 0;
}
第一个输出"Hello world",第二个发生段错误。
原因是:
c++实现成员函数的时候,会在成员函数中默认的第一个参数为本类的地址,所以以上就相当于fun(nullptr)。
而实现虚函数的时候,是需要与对象的内存相关的。发生虚函数调用时,首先在本对象的首地址去找虚函数表,找到相应的虚函数才会调用。而空指针自然就没有虚函数表了。