Reinterpret_cast non restituirà mai un indirizzo diverso: è necessario copiare l'indirizzo esatto.
In caso di ereditarietà multipla, come ha affermato David Rodriguez, l'indirizzo di una delle basi può restituire un indirizzo che ha un offset all'indirizzo della prima base. Reinterpret_cast restituirà quell'indirizzo offset, ma se lo tratti come indirizzo upcast, ne conseguirà l'inferno.
Per l'upcasting, static_cast può restituire un indirizzo diverso da quello specificato. Se l'indirizzo che hai è una delle basi e quell'indirizzo è in offset rispetto al primo indirizzo di base, static_cast restituirà un indirizzo valido per l'oggetto upcasted, che è uguale all'indirizzo della prima base e quindi non è uguale al puntatore passato.
Per farla breve: reinterpret_cast ti dà lo stesso indirizzo, sempre. Static_cast e dynamic_cast potrebbero restituire un indirizzo diverso, ad es. in alcuni casi che coinvolgono eredità multiple.
La differenza tra static_cast e dynamic_cast è che static_cast non controlla se il puntatore che gli dai è l'oggetto giusto per il cast, quindi assicurati di farlo prima di chiamarlo.
significa "modifica il valore" a cui punta il puntatore? – akira
@akira: no, cambia il valore del puntatore stesso – sharptooth
intendendo: 'T * t = 0x13; Q * q = 0x42; t = reintrepret_cast