C++中当对象指针为空时,虚函数和非虚函数的调用情况
2013-10-25 18:24
567 查看
当我们定义一个类的对象为空时,这时我们调用该对象中的函数,我们会发现当调用非虚函数时仍可以正常调用,而如果要调用虚函数则会报错。如下示例:
输出结果如下,可以正常输出:
同样,当我将类成员函数定义为虚函数时:
会发现编译没有问题,但运行时会报内存错误:
同样,我们再测一下对已经申请了内存的对象用delete 释放内存后的情况,如下:
运行结果如下:
我们发现对象仍旧可以正常调用类中的函数,同样的我们将print() 函数定义成虚函数时,同样会出现运行错误,delete 之后的函数就已经无法调用了。
由以上几种情况我们发现当类的对象指针为空时,并不是指该对象就不存在,当我们的指针没有用来指向其他地方时,此时该指针都可以调用类中成员函数,但无法调用其虚函数。同样的道理,当我们用 delete 释放一个类的对象内存空间时,并不是将该对象内存空间进行清除,而是将这块内存的使用权释放了,但里面的东西可能还依然存在,所以在这块内存被其他对象占用之前里面的东西依然会存在,所以即使我们将对象指针指向空后,依然可以调用类中的函数。
这里要强调的是,delete只是把指针所指的内存释放掉,并没有把指针本身给干掉。我们平常将指针所指内存释放掉之后会让内存指向空,这是为了防止产生野指针,为了下次调用指针的时候方便判断使用,并不是将该指针指向NULL后指针什么都没有了。
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++中使用对象和使用指针调用虚函数时对缺省参数的处理
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C++调用一个成员函数的需求this指针的情况
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C++调用空指针对象的成员函数——静态绑定与动态绑定
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- C++学习笔记---利用对象、引用、指针调用虚函数
- C++调用空指针对象的成员函数成功的理解
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- C++调用成员函数需要this指针的情况
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- c++函数在传入对象参数和返回对象时候的内存调用情况
- 浅析C++中虚函数的调用及对象的内部布局
- C++ 函数调用操作符 () 、 函数对象
- C++指针探讨 (四) 函数对象
- 使用类成员函数指针调用C++成员函数的一种方式
- C++指针探讨 (四) 函数对象