¿Debo usar dynamic_cast al llamar a una función que acepta la clase base?
-
06-07-2019 - |
Pregunta
Tengo algunas clases como esta:
interface class IA
{
};
interface class IB
{
};
public ref class C : public IA, public IB
{
};
public ref class D
{
void DoSomething(IA^ aaa)
{
}
void Run()
{
C^ bob = gcnew C();
DoSomething(dynamic_cast<IA^>(bob)); // #1
DoSomething(bob); // #2
}
};
En este momento, siempre trato de usar la conversión dinámica al llamar a una función de este tipo, (el # 1 arriba).
Sin embargo, hace que el código sea bastante feo, así que quiero saber si es realmente necesario.
¿Usas dynamic_cast de esta manera? Si es así, ¿cuál es la razón principal?
Solución
Como sabemos que bob
es de tipo C ^
, sabemos que en el momento de la compilación se puede descargar a IA ^
de forma segura, y así dynamic_cast
es equivalente a static_cast
aquí. Además, el reparto implícito que propones también es seguro.
dynamic_cast
solo es necesario cuando se realiza una conversión ascendente de un tipo base a un derivado.
Otros consejos
En C ++ estándar, usa dynamic_cast para desplazarse por la jerarquía, no hacia arriba. En este caso, lo utilizarías para tratar de convertir una IA o IB en una C:
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
No, creo que en C ++ / CLI tampoco necesita el reparto dinámico aquí. Derivado * se convierte implícitamente a Base * a menos que exista una ambigüedad w.r.t. Herencia múltiple. Lo mismo probablemente es cierto para " gc-pointers " ;. En C ++, una conversión dinámica, cuando se realiza una conversión ascendente, requiere clases polimórficas (con al menos una función virtual). Sin embargo, no sé cómo C ++ / CLI lo maneja. Creo que cada clase de CLI es polimórfica por defecto.
Es posible que desee eliminar la etiqueta C ++, por cierto. ;)