2011-09-15 16 views

Respuesta

9

No. Esto no es posible (transmisión directa desde A* a B*).

Porque la dirección de A y B se encuentran en diferentes ubicaciones en class C. Por lo tanto, el reparto siempre será inseguro y posiblemente pueda caer en el comportamiento inesperado. Demo.

El casting siempre debe pasar por class C. p.ej.

A* pa = new C(); 
B* pb = static_cast<C*>(pa); 
        ^^^^ go through class C 

Demo

+0

Gracias. El comportamiento inesperado es exactamente lo que tuve) – Andrew

+0

Pero no puedo entender por qué dynamic_cast fue correcto – Andrew

+0

@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

2

Sí, primero debe static_cast objeto a C *, entonces se puede volver a static_cast B (aunque este último elenco no es necesario, ya que es una conversión estándar). No estoy seguro de si el objeto static_cast directamente a B funcionaría, intente y vea si obtiene errores de compilación. reinterpret_cast el objeto B le generaría un bloqueo en el tiempo de ejecución, ya que A y B tendrían direcciones diferentes si ambas no están vacías.

Editar Después de haber cambiado la pregunta, ya no es posible hacer lo que desea. Necesita saber la ruta correcta hacia arriba y hacia abajo del árbol de herencia, ya que la conversión en un escenario con herencia múltiple con clases no vacías implica cambios en el puntero.

+0

Por favor, consulte mi edición (Importante) – Andrew

0

Siempre que el objeto se derive de B, siempre puede convertir el objeto en B. Y, por supuesto, solo puede llamar a los métodos definidos en la interfaz B, ya que el puntero virtual solo puede acceder al método definido por B en la mesa virtual.

8

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í.

Cuestiones relacionadas