现在的位置: 首页 > 综合 > 正文

delete this的问题

2012年04月16日 ⁄ 综合 ⁄ 共 1015字 ⁄ 字号 评论关闭
TEST1:
#include <iostream>
using namespace std;

class Base
{
public:
    
virtual ~Base()
    { 
        cout 
<< "Base dtor!" << endl;
    }
};

class Derived : public Base
{
private:
    
virtual ~Derived()
    { 
        cout 
<< "Derived dtor!" << endl;
    }
};

int main()
{
    Derived
* pd=new Derived;
    
//delete pd;     //error,相当于调用pd->~Derived()
    Base* pb=new Derived;
    delete pb;

    return 0;
}

/*
* Base的dtor可见,虽然会被virtual到Derived的dtor上去,这就是所谓的dynamic binding可以突破访问权限,其实访问权限本来就是只有在编译期起作用的,想清楚编译期和运行时其实很容易理解上面代码

*/

TEST2:

#include <iostream>
using namespace std;

class Base 

public:
    
void destroy() //伪析构
    {
        cout 
<< "DTOR"<< endl;
        delete 
this;
    }

private
    
~Base() {} 
};

int main()
{
    Base 
*pb = new Base;//ok
    pb->destroy();

    Base b;             //error: "cannot access private member declared in class 'Base'"
    b.destroy();

    return 0;
}

/*
   不论是静态的或是普通成员函数都是可以通过delete或delete this删掉这样的一个对象。
   这种私有dtor加上刚才说的伪析构的成员函数可以达到只允许new来创建对象实例,
   而不允许直接定义实例的效果。
 
*/

/*因为b 是局部变量(auto),所以生命期末会调用析构函数,而析构函数为private*/

抱歉!评论已关闭.