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;
} /*
* Base的dtor可见,虽然会被virtual到Derived的dtor上去,这就是所谓的dynamic binding可以突破访问权限,其实访问权限本来就是只有在编译期起作用的,想清楚编译期和运行时其实很容易理解上面代码
*
*/
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();
b.destroy();
} /*
不论是静态的或是普通成员函数都是可以通过delete或delete this删掉这样的一个对象。
这种私有dtor加上刚才说的伪析构的成员函数可以达到只允许new来创建对象实例,
而不允许直接定义实例的效果。
*/ /*因为b 是局部变量(auto),所以生命期末会调用析构函数,而析构函数为private*/
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*/