Está permitido escribir una instancia de Derivado sobre una instancia de Base?
Say, el código
class Derived: public Base {....}
Base* b_ptr = new( malloc(sizeof(Derived)) ) Base(1);
b_ptr->f(2);
Derived* d_ptr = new(b_ptr) Derived(3);
b_ptr->g(4);
d_ptr->f(5);
Parece ser razonable y LSP está satisfecho.
Sospecho que este código está permitido de manera estándar cuando Base y Derivados son POD, y no está permitido de otra manera (porque se sobreescribe vtbl ptr). La primera parte de mi pregunta es: indique la condición previa precisa de tal sobrescritura.
Pueden existir otras formas estándar permitidas de sobrescribir.
La segunda parte de mi pregunta es: ¿hay alguna otra forma? ¿Cuáles son sus condiciones previas precisas?
UPDATE: NO quiero escribir código como este; Estoy interesado en la posibilidad teórica (o imposibilidad) de dicho código. Entonces, esta es una pregunta "nazi estándar", no una pregunta "¿cómo puedo ...?". (¿Mi pregunta debe ser trasladada a otro sitio de stackoverflow?)
ACTUALIZACIÓN2 y 4: ¿Qué pasa con los destructores? La semántica supuesta de este código es "La instancia base se actualiza (destructivamente) por segmento de instancia derivada". Supongamos, por simplicidad, que la clase Base tiene un destructor trivial.
UPDATE3: Lo más interesante para mí esla validez del acceso a través deb_ptr->g(4)