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;
}
};
このように使用されます:
int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}
呼び出しでは、仮想デストラクタがない場合でもp->suicide()
、のデストラクタがMyKlass
期待どおりに呼び出されます。ISuicidal
私にとって、これは理にかなっています。なぜなら、MyKlass::suicide
では、の静的タイプはでthis
あることがわかっているMyKlass*
ので、正しいデストラクタが呼び出されるからです。typeid
これは、内に電話をかけることで簡単に確認できsuicide
ます。
それで、FAQエントリは不正確ですか、それとも私はそれを誤解していますか?