Eli*_*sky 3 c++ polymorphism self-destruction virtual-destructor
C ++ FAQ Lite的16.15节讨论delete 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;
}
};
Run Code Online (Sandbox Code Playgroud)
因此使用:
int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调用中p->suicide(),即使没有虚拟析构函数MyKlass,也会ISuicidal按预期调用的析构函数。
在我看来,这是有道理的,因为在中MyKlass::suicide,this已知的静态类型为MyKlass*,因此将调用正确的析构函数。通过在typeid内部放置呼叫很容易验证suicide。
那么FAQ条目是否不正确,还是我误会了?