El camino a seguir de cualquier tipo a cualquier otro es dynamic_cast. Pero requiere que el objeto sea polimórfico. En general, esto requiere una tabla v estar asociado tanto a A
y B
, así que: si A y B tienen al menos una función virtual, y RTTI no es neutralización,
A* pa1 = new C;
A* pa2 = new A;
B* pb1 = dynamic_cast<B*>(pa1);
B* pb2 = dynamic_cast<B*>(pa2);
resultará en PB2 a ser nulo, y pb1 para apuntar a la parte B del objeto que contiene * pa1 como su parte A. (El hecho de que sea C o cualquier otro derivado de esas dos bases no importa).
De lo contrario, donde todas las necesidades a ser estáticos, usted tiene que ir a C
B* pb = static_cast<B*>(static_cast<C*>(pa));
Tenga en cuenta que no se puede compilar static_cast<B*>(pA)
, siendo A y B sin relación entre sí.
Gracias. El comportamiento inesperado es exactamente lo que tuve) – Andrew
Pero no puedo entender por qué dynamic_cast fue correcto – Andrew
@Andrew, 'dynamic_cast' también es válido y funcionará (siempre que las clases sean polimórficas); porque 'C' es realmente una subclase de' A'. Sin embargo, en este caso 'static_cast ' será una mejor idea que en el momento de la compilación. –
iammilind