当指针并没有指向实际的对象时,能否调用对象的成员函数

来源:互联网 发布:985优势学科平台 知乎 编辑:程序博客网 时间:2024/05/16 04:51

先看程序吧:(这也是我遇见的笔试题)

#include <iostream>using namespace std;class Test1{public:void func(){cout<<"Test1"<<endl;}};class Test2{public:Test2(int i = 0):val(i){}void func(){cout<<val<<endl;}private:int val;};class Test3{public:virtual void func(){cout<<"Test3"<<endl;}};int main(void){Test1* p1 = NULL;p1->func();//可以输出,为什么Test2* p2 = NULL;p2->func();//报错,为什么Test3* p3 = NULL;p3->func();//报错,为什么return 0;}

为什么Test1可以输出呢?因为这时并不需要p1的地址,因为Test1中的func函数的地址是固定的,编译器给func传入一个this指针,该指针为NULL,但在p1->func()中this指针没有使用到;这就好比是你给一个函数传递了错误的实参,但是这个对应的型参并没有时函数中被使用一样,不影响输出的结果。

这也就解释了为什么Test2中的不能输出,因为它的func使用了成员变量val,所以如果this指针并没有指向这个对象的话,就不能得到成员变量了,自然会出错。

那么Test3又是为什么呢?因为它有虚函数,所以需要虚函数表,vptr是在构造函数中初始化的,而p2并没有构造,故p2->Func();调用失败。


原创粉丝点击