多态下,为什么使用virtual修饰析构函数
问题:
用virtual修饰的析构函数和非虚函数的析构函数有什么区别?
当时以为:只有经过virtual修饰的析构函数,派生类生命周期结束时,才会自动的先调用派生类的析构函数,然后调用基类的析构函数;否则,只会调用派生类的析构函数,不会调用基类的析构函数。
分析:
1. 调用派生类析构函数后,会自动调用其基类析构函数
2. 为多态基类声明virtual析构函数
多态:
- 派生类对虚函数进行了重写
- 通过基类的指针或者引用去调用虚函数
通常base class会有多个derived class,有时并不关心派生类的差别,可以设计一个factory工厂函数,返回指针指向一个派生类对象,使用时,由factory来创建对象。
Basic* factory();
对象位于heap,为了避免泄漏内存和其他资源,需要将factory()返回的每个对象,适当的delete
Basic* pb = factory();
...
delete pb;
pb指针指向一个derived class 对象,而这个对象需要经由一个base class 指针被释放。
- 如果目前的base class有一个non-virtual析构函数
其结果未定义——执行时通常发生的是对象的derived成分没被销毁。对于Derive对象,其Derive成分被销毁,而其基类Basic的析构函数未被调用。出现一个“局部销毁”对象
- 给base class一个virtaul析构函数,就能解决这个问题
tips:基类析构函数带有virtaul修饰,派生类的析构函数省略virtual也是虚函数
- 如果class带有任何virtual函数,它就该拥有一个virtual析构函数