|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
The guy who takes a chance,who walks the line between the known and unknown,who is unafraid of failure,will succeed.
虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
虚析构和纯虚析构就是用来解决通过父类指针释放子类对象
如果子类中没有堆区数据,可以不写虚析构或纯虚析构
虚析构和纯虚析构共性:
1、可以解决父类指针释放子类对象
2、都需要有具体的函数实现
虚析构和纯虚析构的区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
- #include<iostream>
- using namespace std;
- class AAA
- {
- public:
- AAA()
- {
- cout << "AAA的构造函数!!!!!!!!!!!!!!!!!" << endl;
- }
-
- virtual void Show()
- {
- cout << "AAA:Show()!!!!!!!!!!!!!" << endl;
- }
-
- //虚析构和纯虚析构只能存在一个
-
- //虚析构---解决父类指针释放子类对象时不干净的问题 ---->可实例化对象
- virtual ~AAA()
- {
- cout << "AAA的虚析构!!!!!!!!!!!!" << endl;
- }
-
- //纯虚析构 -----需要声明也需要实现 -->一个类要是有了纯虚析构,这个类就是抽象类,无法实例化对象
- virtual ~AAA() = 0;
- };
- //纯虚析构代码实现
- AAA::~AAA()
- {
- cout << "AAA的纯虚析构!!!!!!!!!!!!!!!!!" << endl;
- }
- class BBB : public AAA
- {
- public:
- int *m_size;
-
- BBB(int size)
- {
- cout << "BBB的构造函数!!!!!!!!!!!!!!!!" << endl;
- m_size = new int(size);
- }
-
- virtual void Show()
- {
- cout << *m_size << "BBB:Show()!!!!!!!!!!!!!" << endl;
- }
-
- ~BBB()
- {
- cout << "BBB的析构!!!!!!!!!!!!!!!!" << endl;
- if (this->m_size != NULL){
- delete m_size;
- m_size = NULL;
- }
- }
- };
- void test()
- {
- AAA *p = new BBB(999);
- p->Show();
-
- //父类指针在析构时候,不会调用子类中析构函数,导致子类如果有堆区属性,出现内存泄漏---------->析构->虚析构
- delete p;
- }
- int main()
- {
- test();
-
- return 0;
- }
复制代码 渣渣一枚 在线求意见
|
|