虚析构函数
2016-07-13 20:57
211 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csdn_isme_csdn/article/details/51901447
直接定义变量将存储在栈区,如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父类指针的时候将会调用父类析构函数以及子类的析构函数。
如果使用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父类指针的时候将会调用父类析构函数以及子类的析构函数。