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*
,所以调用了正确的析构函数。这很容易通过在typeid
内部调用来验证suicide
。
那么FAQ条目是不准确的,还是我误解了它?