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条目是不准确的,还是我误解了它?