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?

¿Fue útil?

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. ;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top