2014-09-01 23 views
24

5.2.7/7 dice qualcosa sulla falsariga di:Quando è utile dynamic_cast <void*>?

Se T è "puntatore a cv void", il risultato è un puntatore alla classe più derivata puntato da x.

Qual è una buona applicazione di questo synatx? Quando dovrebbe essere usato dynamic_cast<void*>?

+0

Ecco un esempio di ciò che sta descrivendo MSalters: http://ideone.com/84U5ax –

+0

Penso ripartitori possono fare uso di questa (gestione della memoria). Per esempio. se hai bisogno dell'indirizzo iniziale di un blocco di memoria, ma hai solo un puntatore a una classe base. – dyp

+0

@dyp: se si dispone già di un oggetto, la sua memoria deve essere già allocata, quindi un allocatore non può allocarlo di nuovo. E per la deallocazione è necessario più del semplice indirizzo di base, è necessario il tipo più derivato in modo da poter eseguire tutti i distruttori. – MSalters

risposta

26

Un motivo comune è capire se due interfacce IA* e IB* sono in realtà puntatori allo stesso oggetto sottostante. Se ti serve, usa il cast.

IIRC, è ancora possibile in caso di ereditarietà multipla con una base non virtuale ripetuta avere due IA* puntatori che risultano disuguali, ancora punto allo stesso oggetto - che puntano a due differenti IA sottoggetti.

+1

Non capisco quale sia la differenza tra 'dynamic_cast (ptr)' e 'static_cast (ptr)' (poiché 'void *' non ha alcun RTTI o vtable) .... –

+0

@BasileStarynkevitch 'ptr' è un puntatore al tipo di classe, quindi può avere RTTI. – Oktalist

+0

Quindi, "void *" è un puntatore generico, quindi non avere RTTI, IMHO. –

5

Quando hai qualcosa di simile:

template<typename X, typename Y> 
bool operator==(const X* px, const Y* py) { 
    return dynamic_cast<void*>(px) == dynamic_cast<void*>(py); 
} 
+1

Non c'è un 'ritorno 'superfluo qui? – Morwenn

+0

E stai gettando via 'const'. – Oktalist