zoukankan      html  css  js  c++  java
  • [百度空间] [转+原]虚析构函数

    析构函数何时该时虚拟的?
      当你可能通过基类指针删除派生类对象时。
      
      虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,delete basePtr时(译注:即基类指针),*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。这通常是一件好事情。

    以上摘选自: http://blog.tianya.cn/blogger/post_show.asp?BlogID=75687&PostID=6299328
      
     VS2005测试:

    class t0
    {
    int i0;
    public:
    t0() :i0(0) {}
    /*virtual*/ ~t0() {}
    };

    class t1 :public t0
    {
    int i1;
    public:
    t1() :i1(0) {}
    ~t1() {}
    static void* operator new(size_t size)
    {
       return ::malloc(size);
    }
    static void delete(void*p)
    {
       ::free(p);
    }
    };

    int _tmain()
    {
    t0* pt0 = new t1;
    delete pt0;
    }

    //当t0的析构声明为virtual时,delete所做的(正确工作)是:
    //1.调用t1::~t1()
    //2.调用t0::~t0()
    //3.调用t1::operator delete

    //对于上例中的情况:
    //当t0的析构函数没有声明virtual时,delete operator做的工作就是
    //1.只调用 t0::~t0()                           ****问题1
    //2.调用::operator delete                  ****问题2

    以前只是知道,没有virtual声明虚析构函数的时候,通过基类指针的析构会出现问题:只析构基类(问题1).
    这里要注意,如果没有声明virtual,那么某些情况下,不仅仅是析构函数的调用有问题,operator delete也会出现问题.


    另外经过测试,在导入了DLL的时候,在DLL中创建的类,在EXE中delete 它的(纯)虚基类指针,则EXE会自动找到DLL中该类的operator delete,和析构函数,即使operator delete和析构函数这两个接口在EXE中并没有暴露..OO果然很强大..(还是MSVC compiler强大....?)
    但是,析构函数的调用还可以理解,因为虚指针中的vtable中有析构函数的指针,但是operator delete呢?莫非.....


    嗯,dector和operator delete不管内部如何实现,或许对OO来说,要求都一样,都是OO的多态必须解决的问题...

  • 相关阅读:
    jQuery 操作元素属性、内容、css、class
    jQuery 选择器
    JavaScript 二级菜单(含过渡动画)
    tools.js
    JavaScript JSON
    中华人民共和国国务院令第644号 国务院关于修改《全国年节及纪念日放假办法》的决定
    Linux系统Yum仓库制作
    玩转Linux系统之常用命令
    IDEA安装插件提示was not installed: Cannot download解决办法
    软件开发过程中常用的环境解释DEV FAT UAT PRO
  • 原文地址:https://www.cnblogs.com/crazii/p/4512824.html
Copyright © 2011-2022 走看看