#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Animal13{
public:
    Animal13(){
        cout << "Animal的默认构造函数" << endl;
    }
    virtual void speak(){
        cout << "动物叫" << endl;
    }
    // 虚析构
    // 如果子类中有指向堆空间的属性,需要给父类的析构函数设置为虚析构,子类中的析构函数才能调用
    // virtual ~Animal13(){
    //     cout << "Animal的析构函数" << endl;
    // }
    // 纯虚析构:类内声明,类外设置实现
    // 类中如果存在纯虚析构函数,这个类也属于抽象类,无法实例化对象    虚析构和纯虚析构的区别:可否实例化
    virtual ~Animal13(); // virtual ~Animal13() = 0 中 = 0 可以省略
};
Animal13 :: ~Animal13(){
    cout << "Animal的析构函数" << endl;
}
class Cat : public Animal13{
public:
    char* m_name;
    Cat(const char* name){
        cout << "Cat的构造函数" << endl;
        this->m_name = new char[strlen(name) + 1];
        strcpy(this->m_name, name);
    }
   virtual void speak(){
    cout << "喵喵" << endl;
   }
   ~Cat(){
       if(this->m_name)
       {
        delete [] this->m_name;
        this->m_name = NULL;
       }
   }
};
int main()
{
    Animal13* animal = new Cat("咪咪");
    animal->speak();
    delete animal;
    animal = NULL;
    return 0;
} 

虚析构函数作用
虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。
纯虚析构函数
纯虚析构函数在c++中是合法的,但是在使用的时候有一个额外的限制:必须为纯虚析构函数提供一个函数体。
纯虚析构函数和非纯析构函数之间唯一的不同之处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。



















