C++析构函数必须要用virtual修饰的原因
来源:互联网 发布:win10仿linux主题 编辑:程序博客网 时间:2024/06/05 03:49
先举例:
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
class Father
{
public:
int m_fMember;
Father(){m_fMember=1;}
~Father(){cout<<m_fMember<<endl;}
};
class Child : public Father{
public:
int m_cMember;
Child(){m_cMember=2;}
~Child(){cout<<m_cMember<<endl;}
};
int main(int argc, char** argv)
{
Father* pObj1 = new Child();
delete pObj1;
cout<<"--"<<endl;
Child* pObj2 = new Child();
delete pObj2;
return 0;
}
运行结果:
1
--
2
1
如果不用virtual函数,是没有执行期绑定一说的,比如pObj1这个指针,其实它是Child对象,但是在释放时,~Child()方法并没有被调用,仅调用了~Father方法。为什么呢?因为没有用virtual,就是编译期绑定,当你在编译时gcc/g++只知道pObj1是个Father对象,所以在delete时就去调用Father的析构了。
而如果定义成virtual ~Father时,结果就是一定会析构Child,这就是为什么析构函数都要用virtual,因为没人知道会不会有子类继承,否则一旦继承,发生这样的事,析构函数里万一释放了些资源,比如SOCKET,比如memory,那就是资源泄露了。
0 0
- C++析构函数必须要用virtual修饰的原因
- 析构函数(Virtual)的原因
- C++构造函数、析构函数必须要给成公有的吗?
- 面试必须要懂的函数
- QThread必须要了解的几个函数
- C++ 析构函数 使用virtual的原因
- C++析构函数后加上virtual的原因
- c 程序必须要从main函数开始执行么?
- 必须要记住的
- C++不要在构造函数和析构函数中调用virtual函数的原因
- 关于函数的自己的参数,我们必须要用全局的变量来接收
- C++中父类的虚函数必须要实现吗?
- C++必须要存在非默认构造函数的条件
- Fragment ,必须要一个空的构造函数
- 构造函数必须要初始化的数据成员
- C语言中必须要搞清楚的几个东东
- [c/c++]析构函数virtual相关
- Android的"必须要XXXX"
- week5、study the protocol of 802.1ag and config the topology of olt agg and bng
- RtlInitUnicodeString、IoCreateDevice、IoCreateSymbolicLink、IoDeleteDevice 四个 API 驱动函数的使用
- Loss Function view---关于损失函数的介绍
- 何为AppID、 AppKey、AppSecret?
- Linux SCP 基于expect密码传输
- C++析构函数必须要用virtual修饰的原因
- 深入理解Java:注解(Annotation)--注解处理器
- hibernate 查询实体类的list
- Java – Static Class, Block, Methods and Variables
- 《聚爆Implosion》性能精析:这是我们测过性能最棒的手游,没有之一!
- jsp中使用el表达式中的fn函数
- BootStrap
- 总结Android调用系统相机拍照遇到的坑
- org.glassfish.jersey.servlet.ServletContainer