Calling a destructor manually is a perfectly valid thing, regardless of if it's virtual. You just want to make sure that it's just called once for every constructor call.
Is it undefined behaviour to use the object after such a destructor call?
Yes.
What if one immediatly reinitializes it with a new (this) MyClass(); call?
Still horrifically undefined.
Do not manually destruct an object unless you had to manually place it, e.g. with placement new or some equivalent, and definitely do not ever re-initialize a destructed object like that and hope to avoid UB. Classes like std::vector
very explicitly make accessing destroyed objects UB, and it remains UB even if you then make a new element in it's place.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…