Раздел 16.15 из C ++ FAQ Lite обсуждает 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 часто неточна, или я неправильно ее понимаю?