为什么析构函数是虚函数
来源:互联网 发布:计算机二级vb 编辑:程序博客网 时间:2024/06/05 11:27
#include <iostream>using namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;}; void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public: ClxDerived() {}; ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};int main(){ ClxDerived *p = new ClxDerived; p->DoSomething(); delete p; return 0;}
输出结果:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
Output from the destructor of class ClxBase!
第二段程序
#include<iostream>using namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;}; void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public: ClxDerived() {}; ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; }}; int main(){ ClxBase *p = new ClxDerived; p->DoSomething(); delete p; return 0; }
结果:
Do something in class ClxBase!
Output from the destructor of class ClxBase!
这样由于使用的不是虚函数,这样删除只是删除一部分,会造成内存泄漏。执行的也是基类的函数。
#include<iostream>using namespace std;class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public: ClxDerived() {}; ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };}; int main(){ ClxBase *p = new ClxDerived; p->DoSomething(); delete p; return 0; }
结果是
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
Output from the destructor of class ClxBase!
这段代码中基类的析构函数被定义为虚函数,在main函数中用基类的指针去操作继承类的成员,释放指针P的过程是:只是释放了继承类的资源,再调用基类的析构函数.调用dosomething()函数执行的也是继承类定义的函数. 如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函
0 0
- 为什么析构函数是虚函数
- 析构函数为什么是虚函数
- 为什么析构函数是虚函数
- 基类的析构函数为什么是虚函数?
- 基类的析构函数为什么是虚函数
- 为什么析构函数最好是虚函数?
- 为什么基类的析构函数是虚函数
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- 析构函数为什么一般是虚函数
- 为什么析构函数常常是虚函数
- 为什么基类的析构函数是虚函数
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- 基类的析构函数为什么是虚函数?
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- javascript第三章
- NOI2014--起床困难症
- http的GET请求和查看返回结果
- 文件处理
- 【Python】 sorted函数
- 为什么析构函数是虚函数
- [C/C++]C++常用的基础小结
- MySQL 性能优化的最佳 20+ 条经验
- caffe入门----Layer
- select中option解析
- float浮动
- mysql的join操作
- 题目1370:数组中出现次数超过一半的数字
- 模拟实现栈