Preciso usar dynamic_cast ao chamar uma função que aceita a classe base?
-
06-07-2019 - |
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?
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. ;)