Say, the code
class Derived: public Base {....}
Base* b_ptr = new( malloc(sizeof(Derived)) ) Base(1);
b_ptr->f(2);
Derived* d_ptr = new(b
I think the overwrite is allowed.
If it was me I'd probably call Base::~Base before reusing the storage, so that the lifetime of the original object ended cleanly. But the standard explicitly allows you to reuse the storage without calling the destructor.
I don't believe your access via b_ptr is valid. The lifetime of the Base object has ended.
(See 3.8/4 in either standard for the rules on lifetime.)
And I'm also not entirely convinced that b_ptr must give the same address as was originally returned by the malloc() call.