类nullptr指针指向成员函数
C++空指针可以调用类成员函数,但是【不能调用】类中的【虚函数】
一个对象的指针可以调用它的成员函数和虚函数,
那么如果一个指向空nullptr的指针,能不能调用它的成员函数和虚函数。
```
#include<iostream>
using namespace std;
class A
{
public:
void func1()
{
//_a = 1;
}
virtual void func2()
{
}
private:
int _a = 10 ;
};
int main()
{
A *p = nullptr;
p->func1();
p->func2();
system("pause");
return 0;
}
```
问题一:空指针为什么能调用成员函数?
对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。当调用p->func1(); 这句话时,其实就是调用A::func1(this);而成员函数的地址在编译时就已经确定, 需要注意的是,你用空指针调用成员函数,只是让this指针指向了空,所以空指针也是可以调用普通成员函数,只不过此时的this指针指向空而已,但函数fun1函数体内并没有用到this指针,所以不会出现问题。
当成员函数体内用到this指针时,如果你的this指针是空,那么程序就会崩溃。比如,如果把 _a=1; 这句话放开,程序就会出问题,原因就是this指针指向空,当进行赋值的时候,编译器不知道这个成员变量是哪一个对象的,所以他不知道给哪个对象的_a赋值,因此就会出错。
问题二:空指针为什么不能调用虚函数?
我们知道,如果一个类中包含虚函数,那么他所实例化处的对象的前四个字节是一个虚表指针,这个虚表指针指向的是虚函数表。当然,虚函数的地址也是在编译时就已经确定了,这些虚函数地址存放在虚函数表里面,而虚函数表就在程序地址空间的数据段(静态区),也就是说虚表的建立是在编译阶段就完成的;当调用构造函数的时候才会初始化虚函数表指针,即把虚表指针存放在对象前四个字节(32位下)。试想一下,假如用空指针调用虚函数,这个指针根本就找不到对应的对象的地址,因此他也不知道虚表的地址,没有虚表的地址,怎么能调用虚函数呢。
Form https://blog.csdn.net/qingtu11/article/details/118976724