Dois-je utiliser dynamic_cast lorsque j'appelle une fonction qui accepte la classe de base?
-
06-07-2019 - |
Question
J'ai des cours comme celui-ci:
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
}
};
Pour le moment, j'essaie toujours d'utiliser la diffusion dynamique pour appeler une telle fonction (numéro 1 ci-dessus).
Cependant, cela rend le code assez moche, donc je veux savoir s'il est réellement nécessaire.
Utilisez-vous dynamic_cast de cette manière? Si oui, quelle est la raison principale?
La solution
Puisque nous savons que bob
est de type C ^
, nous savons qu'au moment de la compilation, il peut être converti en IA ^
en toute sécurité, et ainsi de suite. dynamic_cast
est équivalent à static_cast
ici. De plus, la distribution implicite que vous proposez est également sûre.
dynamic_cast
n'est nécessaire que lors de la conversion ascendante d'un type de base à un dérivé.
Autres conseils
En C ++ standard, vous utilisez dynamic_cast pour descendre dans la hiérarchie et non vers le haut. Dans ce cas, vous l’utiliseriez pour essayer de convertir un IA ou un IB en un C:
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
Non, je penserais qu'en C ++ / CLI vous n'avez pas besoin de la distribution dynamique ici. Derived * convertit implicitement en Base * sauf en cas d'ambiguïté. héritage multiple. Il en va probablement de même pour "gc-pointers". En C ++, une conversion dynamique - lors de la conversion ascendante - nécessite des classes polymorphes (avec au moins une fonction virtuelle). Je ne sais pas comment C ++ / CLI le gère, cependant. Je pense que chaque classe de la CLI est polymorphe par défaut.
En passant, vous voudrez peut-être supprimer la balise C ++. ;)