Dois-je utiliser dynamic_cast lorsque j'appelle une fonction qui accepte la classe de base?

StackOverflow https://stackoverflow.com/questions/1613706

  •  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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top