C++ 小菜1:虚析构函数

来源:互联网 发布:云上贵州数据交换平台 编辑:程序博客网 时间:2024/05/22 17:19

什么是虚析构函数?

C++中的析构函数用于内存的回收和清理。当子类实例被回收时,析构函数执行顺序如下:

1. 子类析构函数

2. 父类析构函数

对于虚析构函数,简单地说,就是被声明为虚函数的析构函数。要定义一个虚析构函数,你只需要在析构函数头前加上关键字 “virtual”。

 

为什么我需要使用虚析构函数?

如果基类的析构函数不是虚函数,那么当 delete 一个被声明为基类但却被初始化为继承类(如声明为基类的指针,却指向了继承类)的实例,继承类的析构函数将不会被调用。具体事例如下:

    1. class Base
    2. {
    3.      ~Derived()      
    4.      {   
    5.       // some virtual methods
    6.          cout << “Destroying Base”<< endl;
    7.       }
    8. };
    9. class Derived : public Base
    10. {
    11.         ~Derived()
    12.        {
    13.               // Do some important cleanup
    14.              cout << “Destroying Derived”;
    15.        }
    16. }
    • Base *b = new Derived();
    • // use b
    • delete b; // Here’s the problem!

输出结果如下:

Destroying Base

可以发现,继承类的析构函数并没有被执行。解决办法很简单,把Base Class的析构函数声明为虚函数即可,即修改为: virtual ~Derived() 。再次执行,输出结果如下:

Destroying Derived

Destroying Base

 

何时需要使用虚拟析构函数?

只要你的类中有虚函数,就要使用虚析构函数。因为通常基类中都会含有虚函数,这样做能保护你的代码的安全性。如果基类的析构函数为虚函数,那么其继承类的析构函数将被自动声明为虚函数,不用再显式(加 virtual )声明。

原创粉丝点击