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条目是否不正确,还是我误会了?
归档时间: |
|
查看次数: |
1459 次 |
最近记录: |