c
e &d
effettivamente hanno lo stesso valore, e se si reinterpretare pressofuso c
di nuovo ad un D*
si ottiene un puntatore valido che si può risolvere il riferimento. Inoltre, puoi trattare c
come (puntatore al primo elemento di) una matrice opaca char[sizeof(D)]
- questo è infatti lo scopo principale di puntare i puntatori ai puntatori di caratteri: Per consentire la serializzazione (de) (ad es. ofile.write(c, sizeof(D));
), anche se generalmente solo fate questo per i tipi primitivi (e le loro matrici), poiché la disposizione binaria dei tipi composti non è generalmente specificata in modo portatile.
Come sottolinea giustamente @Oli e vorrei che io rinforzassi, non dovresti mai serializzare i tipi di composti nel loro complesso. Il risultato non sarà quasi mai deserializzabile, poiché l'implementazione di classi polimorfiche e padding tra campi di dati non è specificata e non è accessibile all'utente.
Si noti che reinterpret_cast<char*>(static_cast<B*>(&d))
può essere considerato come un array opaco char[sizeof(B)]
con un ragionamento simile.
fonte
2011-12-18 23:05:28
Penso che il tuo distruttore sia stato erroneamente chiamato –
Non conosco la risposta. Ma, quando mai questa conoscenza ** sarà ** utile nella pratica? –
Buona domanda. Alcuni cast possono effettivamente cambiare l'indirizzo (ad esempio quando sono coinvolte più eredità).Mi chiedo se sia così. – Kos