标签:知识点 易错 调用 函数 Parent 子类 C++ son 析构
首先来看这样一个场景,观察构造析构的调用析构顺序。
#include<iostream>
using namespace std;
class Parent{
private:
int a;
public:
Parent() { cout<<"Parent()"<<endl; }
~Parent() { cout<<"~Parent()"<<endl; }
};
class son :public Parent {
private:
int b;
public:
son() { cout<<"son()"<<endl; }
~son() { cout<<"~son()"<<endl; }
};
int main()
{
son* p = new son;
delete p;
return 0;
}
最后我们发现构造函数,析构函数的调用是正常情况,符合我们意料之中。
那么现在如果把main()函数当中的son* p = new son;
语句改成Parent* p = new son;
呢?
运行结果如下:
结果我们发现少了son类的析构。
这样肯定是不行的,现在我们来分析背后的原因,好提出解决办法:
1)一个子类的堆对象被父类指针指向了
2)使用delete p内部的工作过程是先调用对应的析构函数。然后释放p申请的内存。即p->Parent();
然后free(p)
分析到这里情况应该比较明确了,因为该子类的堆对象被父类指针指向了,delete时会先调用父类的析构函数,然后直接释放内存,而不会去调用子类析构函数。
解决方法就是将父类子类的析构函数都声明为虚函数
可以看出,虚析构函数可以解决上文发现的问题。事实上将虚构函数声明为虚函数以后,p->Parent()
这一步就变成了虚函数的间接调用,会查找虚表,调用子类对象本身的虚构函数。
标签:知识点,易错,调用,函数,Parent,子类,C++,son,析构 来源: https://blog.csdn.net/weixin_42445051/article/details/122469700
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。