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

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

#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();调用失败。


你可能感兴趣的:(当指针并没有指向实际的对象时,能否调用对象的成员函数)