第C++ FAQ Lite的16.15节讨论了delete this
,然后提到:
当您没有虚构造函数时,如果您的this指针是指向基类的指针,则适用于通常的注意事项。
为什么会这样呢?考虑以下代码:
class ISuicidal {
public:
virtual void suicide() = 0;
};
class MyKlass : public ISuicidal {
public:
MyKlass() {
cerr << "MyKlass constructor\n";
}
~MyKlass() {
cerr << "MyKlass destructor\n";
}
void suicide() {
delete this;
}
};
使用方法:
int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}
在调用
p->suicide()
时,MyKlass
的析构函数按预期被调用,即使ISuicidal
没有虚析构函数。对我来说这是有道理的,因为在
MyKlass::suicide
中,this
的静态类型已知为MyKlass*
,因此正确的析构函数被调用。这可以通过在suicide
内部放置typeid
调用来轻松验证。那么FAQ条目是否不准确,还是我误解了它?