zoukankan      html  css  js  c++  java
  • C++析构函数后加上virtual的原因

        虚函数:指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,实现动态绑定。

        C++析构函数加上virtual是为了防止内存泄漏。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。

     1 class Base
     2 {
     3     public:
     4     virtual void function()
     5     {
     6         cout<<"this is Base's function"<<endl;
     7     }        
     8     
     9     virtual ~Base()
    10     {
    11         cout<<"this is Base's destroy"<<endl;
    12     }
    13 };
    14  
    15 class Derived:public Base
    16 {
    17     public:
    18     void function()
    19     {
    20         cout<<"this is Derived's function"<<endl;
    21     }
    22     
    23     ~Derived()
    24     {
    25         cout<<"this is Derived's destroy"<<endl;
    26     }
    27 };
    28  
    29 int main()
    30 {
    31     Base *ptr = new Derived();
    32     ptr->function();
    33     delete ptr;
    34     return 0;
    35 }

        上面的代码,我先写了虚函数function,第31行就是动态绑定,而33行delete删除的是Base型基类指针,此指针是没有派生类Derived的析构函数的,所以如果不在基类的析构函数加上virtual的话,就不能动态绑定派生类的析构函数(当然析构函数的动态绑定你可以看出来跟一般函数的动态绑定相比是特殊的,析构函数的虚函数不用按照函数名来找对应的的函数)。

         一句话:基类的析构函数加了virtual就可以动态绑定派生类的析构函数,这样的话,在执行多态后删除其对象,就可以在删除对象的时候执行派生类的析构函数了(当然执行基类的析构函数是一定会的)。否则不会执行派生类的析构函数。

    代码输出结果:

    1 this is Derived's function
    2 this is Derived's destroy
    3 this is Base's destroy

    你可以尝试一下把基类的析构函数前的virtual删掉(第9行),输出结果将是:

    1 this is Derived's function
    2 this is Base's destroy

    你可以观察到,没有执行派生类的析构函数。

    原文:https://blog.csdn.net/u014453898/article/details/60402586

  • 相关阅读:
    b_lg_选学霸(并查集+01背包)
    b_lq_小明的魔法(反向思维)
    多测师课堂019_第一个月综合面试题(01) _高级讲师肖sir
    多测师课堂017_项目数据 _高级讲师肖sir
    linux whoami 显示当前用户的用户名
    linux shutdown 命令 关机 重启
    linux reboot 重启命令
    linux基础 目录
    linux uname 命令 打印系统信息
    前端 CSS层叠性 CSS选择器优先级
  • 原文地址:https://www.cnblogs.com/BobPong/p/13887848.html
Copyright © 2011-2022 走看看