#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可以突破访问权限,其实访问权限本来就是只有在编译期起作用的,想清楚编译期和运行时其实很容易理解上面代码
*
*/
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 */
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 */