c
&d
y efectivamente tienen el mismo valor, y si reinterpretar-Cast c
de nuevo a un D*
se obtiene un puntero válido que puede eliminar la referencia. Además, puede tratar c
como (puntero al primer elemento de) una matriz opaca char[sizeof(D)]
- este es de hecho el propósito principal de lanzar punteros a punteros char: Para permitir (de) serialización (p. Ej. ofile.write(c, sizeof(D));
), aunque en general solo debería haga esto para los tipos primitivos (y arreglos de los mismos), ya que la disposición binaria de los tipos compuestos generalmente no se especifica de manera portátil.
Como señala correctamente @Oli y me gustaría que lo reforzase, en realidad nunca debería serializar los tipos de compuestos como un todo. El resultado casi nunca será deserializable, ya que la implementación de clases polimórficas y el relleno entre los campos de datos no está especificada y no es accesible para usted.
Tenga en cuenta que reinterpret_cast<char*>(static_cast<B*>(&d))
se puede tratar como una matriz opaca char[sizeof(B)]
por un razonamiento similar.
Creo que su destructor está mal llamado –
No sé la respuesta. Pero, ¿cuándo sería este conocimiento ** alguna vez útil en la práctica? –
Buena pregunta. Algunos moldes realmente pueden cambiar la dirección (por ejemplo, cuando se trata de herencia múltiple).Me pregunto si ese es el caso. – Kos