您的位置:首页 > 编程语言 > C语言/C++

C++中当对象指针为空时,虚函数和非虚函数的调用情况

2013-10-25 18:24 567 查看
当我们定义一个类的对象为空时,这时我们调用该对象中的函数,我们会发现当调用非虚函数时仍可以正常调用,而如果要调用虚函数则会报错。如下示例:

class Progress
{
public:
void print(int L)
{
cout << "L = " << L << endl;
}
};

int main()
{
Progress *a = NULL;
a->print(3);

return 0;
}


输出结果如下,可以正常输出:



同样,当我将类成员函数定义为虚函数时:

class Progress
{
public:
virtual void print(int L)
{
cout << "L = " << L << endl;
}
};

会发现编译没有问题,但运行时会报内存错误:



同样,我们再测一下对已经申请了内存的对象用delete 释放内存后的情况,如下:

class Progress
{
public:
void print(int L)
{
cout << "L = " << L << endl;
}
};

int main()
{
Progress *a = new Progress;
a->print(3);
delete a;
a->print(2);

return 0;
}

运行结果如下:



我们发现对象仍旧可以正常调用类中的函数,同样的我们将print() 函数定义成虚函数时,同样会出现运行错误,delete 之后的函数就已经无法调用了。

由以上几种情况我们发现当类的对象指针为空时,并不是指该对象就不存在,当我们的指针没有用来指向其他地方时,此时该指针都可以调用类中成员函数,但无法调用其虚函数。同样的道理,当我们用 delete 释放一个类的对象内存空间时,并不是将该对象内存空间进行清除,而是将这块内存的使用权释放了,但里面的东西可能还依然存在,所以在这块内存被其他对象占用之前里面的东西依然会存在,所以即使我们将对象指针指向空后,依然可以调用类中的函数。

这里要强调的是,delete只是把指针所指的内存释放掉,并没有把指针本身给干掉。我们平常将指针所指内存释放掉之后会让内存指向空,这是为了防止产生野指针,为了下次调用指针的时候方便判断使用,并不是将该指针指向NULL后指针什么都没有了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 内存 指针