多态下,为什么使用virtual修饰析构函数

多态下,为什么使用virtual修饰析构函数

问题:

用virtual修饰的析构函数和非虚函数的析构函数有什么区别?

当时以为:只有经过virtual修饰的析构函数,派生类生命周期结束时,才会自动的先调用派生类的析构函数,然后调用基类的析构函数;否则,只会调用派生类的析构函数,不会调用基类的析构函数。

分析:

1. 调用派生类析构函数后,会自动调用其基类析构函数

多态下,为什么使用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的析构函数未被调用。出现一个“局部销毁”对象
多态下,为什么使用virtual修饰析构函数_第2张图片

  • 给base class一个virtaul析构函数,就能解决这个问题
    多态下,为什么使用virtual修饰析构函数_第3张图片

tips:基类析构函数带有virtaul修饰,派生类的析构函数省略virtual也是虚函数


  • 如果class带有任何virtual函数,它就该拥有一个virtual析构函数

你可能感兴趣的:(面试题,c++,开发语言)