析构函数为何可以为虚函数?
来源:互联网 发布:徐老师的淘宝店怎么进 编辑:程序博客网 时间:2024/04/29 05:58
首先要明确:
1.每个析构函数(不加 virtual) 只负责清除自己的成员。
2.可能有基类指针,指向的确是派生类成员的情况。(这是很正常的),
那么当析构一个指向派生类成员的基类指针时,程序就不知道怎么办了。
所以要保证运行适当的析构函数,基类中的析构函数必须为虚析构。
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。
示例代码:
1.第一段代码
#include<iostream>
using namespace std;
class ClxBase{
public:
};
class ClxDerived : public ClxBase{
public:
};
运行结果:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
Output from the destructor of class ClxBase!
2.第二段代码
#include<iostream>
using namespace std;
class ClxBase{
public:
};
class ClxDerived : public ClxBase{
public:
};
输出结果:
Do something in class ClxBase!
Output from the destructor of class ClxBase!
3.第三段代码:
#include<iostream>
using namespace std;
class ClxBase{
public:
};
class ClxDerived : public ClxBase{
public:
};
运行结果:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
Output from the destructor of class ClxBase!
内容来自:
http://zhidao.baidu.com/question/207712177.html
http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html
- 析构函数为何可以为虚函数?
- C++ 析构函数 为何一般定义为虚函数
- C++ 析构函数 为何一般定义为虚函数
- 构造函数不能为虚函数,析构函数可以为虚函数
- 构造函数不能为虚函数,析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 将析构函数设置为虚函数,并且析构函数可以为纯虚函数
- 构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数?
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 构造函数为何不能为虚函数
- 构造函数为何不能为虚函数?
- (面试)析构函数可以为虚函数吗?
- 虚函数为何定义为保护类型
- 为什么析构函数可以为虚函数,什么情况下需要将析构函数定义为虚函数?
- 为什么不能把构造函数设为虚函数,却可以把析构函数设为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- DIV浮动层被OCX控件遮蔽解决方案
- ExpandableListView仿QQ好友列表
- 详解 Android AsyncTask
- Path Sum II 二叉树求和
- 通过函数指针调用函数
- 析构函数为何可以为虚函数?
- 欢迎使用CSDN-markdown编辑器
- CSS List
- [MySQL复制错误]Last_Errno: 1666 Last_Error: Error executing row event: 'Cannot execute statement: imposs
- 匈牙利命名法
- js解析Json数据
- Win32时间类型FILETIME/SYSTEMTIME/WINDOWSTIME(FILETIME这个名字很奇怪,其实他跟FILE并没有直接关系,只是很多File的API中,都以这个为时间的类型)
- 网易公开课-iOS7应用开发-笔记-1-(1)
- Flatten Binary Tree to Linked List 将二叉树转为链表