Pergunta

Eu tenho algumas classes como este:

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
    }
};

No momento eu sempre tentar usar fundição dinâmica ao chamar essa função, (o # 1 acima).
No entanto, não tornar o código muito feio, então eu quero saber se é realmente necessário.

Você usa dynamic_cast desta forma? Se assim o que é a principal razão?

Foi útil?

Solução

Uma vez que sabemos bob é do tipo C^, sabemos em tempo de compilação pode ser downcasted para IA^ com segurança, e assim por dynamic_cast é equivalente a static_cast aqui. Além disso, a conversão implícita você propõe também é seguro.

dynamic_cast só é necessária quando fazendo um upcast a partir de um tipo base de um derivado.

Outras dicas

Em C ++ padrão, você usa dynamic_cast para andar para baixo na hierarquia, não para cima. Neste caso, você usaria para tentar converter um IA ou IB em um C:

IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);

Não, eu acho que em C ++ / CLI você também não precisa do elenco dinâmica aqui. Derivado * implicitamente convertidos para a Base * a menos que haja uma w.r.t. ambigüidade herança múltipla. O mesmo provavelmente verdade para "GC-ponteiros". Em C ++ um molde dinâmico - quando upcasting - requer classes de polimórficas (com, pelo menos, uma função virtual). Eu não sei como C lida com ele ++ / CLI, no entanto. Eu acho que todas as classes CLI é por polimórfica padrão.

Você pode querer remover a tag C ++, por sinal. ;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top