直接定义变量将存储在栈区,如Fish fish;将在变量的生命周期结束时自动调用自身和基类的析构函数。
如果使用new关键字创建的对象(如 Fish *fish=new Fish()),编译器将不会自动释放相关的资源,需要手动释放,
使用delete fish将调用析构函数,在析构函数里需自行删除相关资源。
但是在多态的情况下,如果直接delete 父类指针,那么子类的析构函数将不会被调用
如下:
Class Animal
{
~Animal(){cout<<"Animal destrutor function";}
};
Class Fish:Public Animal
{
~Fish(){cout<<"Fish destructor function";}
};
Animal *animal=new Fish();
delete animal;//此时将只会调用父类的析构函数,而不会调用子类的析构函数。
为了delete的时候子类的析构函数也能被调用,需要将基类的析构函数定义成虚析构函数。
如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。
如下:
Class Animal
{
virtual ~Animal(){cout<<"Animal destrutor function";}
};
Class Fish:public Animal
{
~Fish(){cout<<"Fish destructor function";}
};
此时delete父类指针的时候将会调用父类析构函数以及子类的析构函数。