类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

posted @ 2022-09-13 22:19  atomxing  阅读(354)  评论(0编辑  收藏  举报