多态之虚析构和纯虚析构(当子类中有指针堆内存需要释放时,使用虚析构解决父类指针无法释放子类堆内存的问题,防止堆内存泄露)
当子类中有指针堆内存需要释放时,使用虚析构解决父类指针无法释放子类堆内存的问题,防止堆内存泄露
1 #include <iostream> 2 #include "string" 3 using namespace std; 4 5 class Base 6 { 7 public: 8 Base() 9 { 10 cout << "父类构造函数" << endl; 11 } 12 virtual~Base()//当子类中有指针堆内存需要释放时使用虚析构 13 { 14 cout << "父类析构函数" << endl; 15 } 16 17 virtual void func() = 0; 18 }; 19 20 class Son :public Base 21 { 22 public: 23 Son(string name) 24 { 25 m_Name = new string(name); 26 27 cout << "子类构造函数" << endl; 28 } 29 ~Son() 30 { 31 if (m_Name!=NULL)//释放堆内存的好习惯 32 { 33 delete m_Name; 34 m_Name = NULL; 35 cout << "子类析构函数" << endl; 36 } 37 } 38 39 void func() 40 { 41 cout << *m_Name << "子类重写方法" << endl; 42 } 43 44 string *m_Name; 45 }; 46 47 void test(Base *base) 48 { 49 base->func(); 50 base->~Base(); 51 } 52 53 int main() 54 { 55 test(new Son("tom")); 56 57 system("pause"); 58 return 0; 59 }
运行结果:
2.纯虚析构:与虚析构作用一样,但是纯虚析构函数需要在类外实现函数体,否则无法运行,
注意:只要包含一个纯虚函数的类都是抽象类,无法实例化
1 #include <iostream> 2 #include "string" 3 using namespace std; 4 5 class Base 6 { 7 public: 8 Base() 9 { 10 cout << "父类构造函数" << endl; 11 } 12 //virtual~Base()//当子类中有指针堆内存需要释放时使用虚析构 13 //{ 14 // cout << "父类析构函数" << endl; 15 //} 16 virtual~Base() = 0;//当子类中有指针堆内存需要释放时使用虚析构 17 virtual void func() = 0; 18 }; 19 Base::~Base() 20 { 21 cout << "父类析构函数" << endl; 22 } 23 24 class Son :public Base 25 { 26 public: 27 Son(string name) 28 { 29 m_Name = new string(name); 30 31 cout << "子类构造函数" << endl; 32 } 33 ~Son() 34 { 35 if (m_Name!=NULL)//释放堆内存的好习惯 36 { 37 delete m_Name; 38 m_Name = NULL; 39 cout << "子类析构函数" << endl; 40 } 41 } 42 43 void func() 44 { 45 cout << *m_Name << "子类重写方法" << endl; 46 } 47 48 string *m_Name; 49 }; 50 51 void test(Base *base) 52 { 53 base->func(); 54 base->~Base(); 55 } 56 57 int main() 58 { 59 test(new Son(" tom ")); 60 61 system("pause"); 62 return 0; 63 }
运行结果