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 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。