É permitido gravar uma instância de Derivado sobre uma instância de Base?
Diga, o 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);
arece razoável e o LSP está satisfeit
Suspeito que esse código seja permitido padrão quando Base e Derivado forem POD e, caso contrário, não será permitido (porque o vtbl ptr é substituído). A primeira parte da minha pergunta é: indique a pré-condição precisa de uma substituição desse tip
Pode haver outras maneiras permitidas de sobrescreve
A segunda parte da minha pergunta é: existem outras maneiras? Quais são as pré-condições precisas?
UPDATE: Eu não quero escrever código como este; Estou interessado na possibilidade teórica (ou impossibilidade) desse código. Então, essa é uma pergunta "nazista padrão", não uma pergunta "como posso ...". (Minha pergunta foi movida para outro site de stackoverflow?)
UPDATE2 & 4: E os destruidores? A semântica suposta desse código é "A instância base é (destrutivamente) atualizada pela fatia da instância Derivada". Vamos supor, por uma questão de simplicidade, que a classe Base possui um destruidor trivia
UPDATE3: O mais interessante para mim éa validade do acesso viab_ptr->g(4)