有了析构函数之后,为什么还要虚析构和纯析析构?
我们知道析构函数释放父类的资源的,但如果子类中有属性开辟到堆区,那么父类是无法调用到子类的析构代码的,子类的占用的堆区内存如果没有得到释放,那么会造成内存泄漏。
那么要让父类的指针能够调用子类的析构函数,释放子类的堆区内存,就要用到虚析构或者纯虚析构。
虚析构的语法:virtual ~类名()
{
}
纯虚析构的语法: virtual ~类名()=0;
类名::~类名()
{
}
虚析构函数和纯虚析构函数相同点:
1,可以解决父类指针释放子类对象。
2.都需要具体实现。
不同之处:
如果是纯虚析构,该类属于抽象类,无法实例化对象
1 #include<iostream> 2 3 using namespace std; 4 5 class Animal 6 { 7 public: 8 Animal() 9 { 10 cout << "Animal的构造函数" << endl; 11 } 12 virtual void speak() = 0; 13 14 //虚析构 15 //virtual ~Animal() //不加virtual 就不会调用子类的析构函数,会造成内存泄漏 16 //{ 17 // cout << "Animal的虚析构" << endl; 18 //} 19 20 //纯虚析构 ,该类属于抽象类,没有定义就无法实例化对象 21 virtual ~Animal() = 0; 22 }; 23 24 Animal::~Animal() 25 { 26 cout << "Animal的纯虚析构" << endl; 27 28 } 29 class cat :public Animal 30 { 31 public: 32 cat(string name) 33 { 34 m_Name = new string(name); 35 } 36 37 void speak() 38 { 39 cout << "小猫在说话" << endl; 40 } 41 42 ~cat() 43 { 44 cout << "cat的析构函数调用" << endl; 45 if (this->m_Name != NULL) 46 { 47 delete m_Name; 48 m_Name = NULL; 49 } 50 } 51 52 public: 53 string *m_Name; 54 }; 55 int main() 56 { 57 Animal* animal = new cat("Tom"); 58 animal->speak(); 59 delete animal; 60 61 return 0; 62 }