La strada da percorrere da qualsiasi tipo a qualsiasi altro è dynamic_cast. Ma richiede che l'oggetto sia polimorfo. In generale questo richiede una v-table essere associato sia A
e B
, quindi: se A e B hanno almeno una funzione virtuale e RTTI non si disattivano,
A* pa1 = new C;
A* pa2 = new A;
B* pb1 = dynamic_cast<B*>(pa1);
B* pb2 = dynamic_cast<B*>(pa2);
provocherà PB2 per essere nullo e pb1 per puntare alla parte B dell'oggetto che contiene * pa1 come sua parte A. (Il fatto che sia C o qualunque altro derivato da quelle due basi non ha importanza).
In caso contrario, in cui tutte le necessità di essere statiche, è necessario passare attraverso C
B* pb = static_cast<B*>(static_cast<C*>(pa));
Nota che static_cast<B*>(pA)
non può compilare, essendo A e B tra loro non correlati.
fonte
2011-09-15 08:05:14
Grazie. Il comportamento inaspettato è esattamente quello che ho avuto) – Andrew
Ma non riesco a capire perché dynamic_cast è andato bene – Andrew
@Andrew, 'dynamic_cast' è anche valido e funzionerà (a patto che le classi siano polimorfiche); perché 'C' è in realtà una sottoclasse di' A'. Tuttavia, in questo caso 'static_cast ' sarà un'idea migliore come succede al momento della compilazione. –
iammilind