C++ 虚析构函数与析构函数的区别

先看下面代码:

class Parent
{
public:
	Parent();
	~Parent();
};

Parent::Parent()
{
	cout << "基类构造...." << endl << endl;
}

Parent::~Parent()
{
	cout << "基类析构..." << endl  << endl;
}


class Child :public Parent
{
public:
	Child();
	~Child();
};

Child::Child()
{
	cout << "子类构造..." << endl << endl;
}

Child::~Child()
{
	cout << "子类析构..." << endl << endl;
}

int main()
{
	Parent* pObj = new Child();
	delete pObj;
}

以上main函数执行结果为:

基类构造....

子类构造...

基类析构...

通过结果可以看出子类的析构函数没有调用。

修改代码将上面的基类和子类的析构函数都改成一下:

	virtual ~Parent();
	virtual ~Child();

执行结果如下:

基类构造....

子类构造...

子类析构...

基类析构...

比较2次结构可以看出
1、就是一个在析构的时候执行了子类的析构函数,一个在析构的时候没有执行子类的函数。
换句话说当加了virtual 后,就会先执行子类的析构函数,再执行基类的析构函数。
2、不执行析构函数,就可能会存在内存泄露。
很明显,不加virtual的情况下,子类的析构函数没有执行。

那什么情况下用virtual析构函数呢?
个人理解是,C++的特性之一就是多态,当需要用一个基类的指针new子类的对象的时候,在这种情况下,构造的时候基类和子类都有,所以析构的时候,也应该都需要,所以要加上virtual。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值