Вопрос не в этом. Дело в том, что операция delete this вообще говоря противоречит смыслу. Перед вызовом деструктора объект уже не живёт, а его указатель используется, да ещё и виртуальной функцией.
использовать код вроде switch(action) {...} не хочется, т.к. объекты хранят разную информацию.
Код:
class X {}
class A : X {int n;virtual void foo();}
class B : X {double f;}
std::auto_ptr<X> px(new A());
void A::foo()
{
// пожелал заменить себя
// стандартный аллокатор ::new выделит достаточно памяти
px.reset(new B());
// A уже не существует, но используется его указатель
// например: ++n; по идее здесь access violation
}