zoukankan      html  css  js  c++  java
  • 为什么基类的析构函数要声明成虚函数

    记得以后基类(父类) 的析构函数最好是声明为 虚函数 即:virtual 

    开发中遇到了一个比较傻逼的bug,也证明了理论与实际之间的差距。

    在基类中没有声明其析构函数为虚函数,导致delete 释放操作没有执行派生类 的析构函数,导致了内存泄漏,也严重影响了后续操作。

    标题是我从网上找到的一篇文章的标题。

    下面把文章记录下来!

    --------------------------------------------

    原因:

    在公有继承中,基类的虚构函数如果不声明成为虚函数,那么销毁派生类时有可能造成资源泄漏

    class Base{ public:

            Base( ) {   };

          ~Base( ) {   };  

    };

    class Derived :public Base{

       public:

           Derived( ) {   };

         ~Derived( ){   };

    };

    void main( )

    {

       Base *p;

       p = new Derived;

       delete p;

    }

    这种情况会发生销毁不完全的情况,因为delete p调用的是声明类型(即基类)的析构函数,所以只能销毁基类对象而无法销毁派生类对象。

     

    修改:

    class Base{ public:

            Base( ) {   };

          virtual ~Base( ) {   }; 

    };

    class Derived :public Base{

       public:

           Derived( ) {   };

          ~Derived( ){   }; 

    };

    void main( )

    {

       Base *p;

       p = new Derived;

       delete p;

    }

    当基类的析构函数声明为虚函数,那么派生类的析构函数也是虚函数,此时调用delete p时发生动态绑定,运行时会根据实际类型调用该对象的虚函数。

    当然,并不是要把所有类的析构函数都写成虚函数。只有当一个类是基类(即希望被继承)的时候才需要声明成虚函数,因为虚函数的作用是实现多态,而多态是建立在继承的基础上。单一类不能把析构函数写成虚函数,因为会产生额外的开销,比如虚表的创建和虚指针的定义。

    地址:http://blog.csdn.net/ljlstart/article/details/49310475

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/wainiwann/p/7494379.html
Copyright © 2011-2022 走看看