C9程序猿 2021-05-24 11:14 采纳率: 0%
浏览 45

C++中虚析构函数作用和继承

析构函数是在对象消亡时,自动被调用,用来释放对象占用的空间。

虚析构函数执行优先级是子到父,继承中的析构函数也是子到父。

我们是否可利用继承的关系,达到虚析构的效果。

上代码

#include<iostream>
using namespace std;

class Preson
{
public:
	 ~Preson()
	{
		cout << "i am ~preson\n";
	}
};
class chind:public Preson
{
public:
	 ~chind()
	{
		cout << " i am ~chind \n";
	}
};
int main()
{
	Preson* p = new chind;



	//delete特点 1.释放的时候只看是什么函数类型就执行什么函数类型的析构函数
	//2.不管执行的是什么函数类型的析构函数 申请的空间 依旧释放
	delete (chind*)p;

	system("pause");
	return 0;
}

执行结果

i am ~chind
i am ~preson
请按任意键继续. . .

现在我们用虚析构函数

#include<iostream>
using namespace std;
class Preson
{
public:
	 virtual ~Preson()
	{
		cout << "i am ~preson\n";
	}
};
class chind:public Preson
{
public:
	 ~chind()
	{
		cout << " i am ~chind \n";
	}
};
int main()
{
	Preson* p = new chind;



	//delete特点 1.释放的时候只看是什么函数类型就执行什么函数类型的析构函数
	//2.不管执行的是什么函数类型的析构函数 申请的空间 依旧释放
	delete p;

	system("pause");
	return 0;
}

执行结果

i am ~chind
i am ~preson
请按任意键继续. . .

可以看出效果是一样的

总结:delete (强转类型) p  我们依旧释放了 new chind  只不过执行的析构函数不同

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-05-24 14:42
    关注

    在正确的位置做正确的事情,析构虽然可以是虚函数,但是慎用。

    评论

报告相同问题?

悬赏问题

  • ¥15 问题重发,R语言:代码运行过程中出现如下警告,请求如何解决!
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 苍穹外卖拦截器token为null
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关