2009-10-23 10 views
1

J'ai quelques cours comme celui-ci:Ai-je besoin d'utiliser dynamic_cast pour appeler une fonction qui accepte la classe de base?

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

Au moment où j'essaie toujours d'utiliser la coulée dynamique lors de l'appel d'une telle fonction, (le n ° 1 ci-dessus).
Cependant, cela rend le code assez moche, donc je veux savoir si c'est réellement nécessaire.

Utilisez-vous dynamic_cast de cette façon? Si oui, quelle est la raison principale?

+1

S'il vous plaît noter que C++ et C++ - cli sont des bêtes très différentes, de sorte que vous pouvez supprimer la balise C de. – bdonlan

+0

Fait (bien que je suppose qu'il aurait le même comportement ...) – demoncodemonkey

Répondre

1

Puisque nous savons bob est de type C^, nous savons au moment de la compilation, il peut être downcasted à IA^ en toute sécurité, et ainsi dynamic_cast équivaut à static_cast ici. De plus, la distribution implicite que vous proposez est également sûre.

dynamic_cast est nécessaire uniquement lors d'une mise à jour d'un type de base vers un dérivé.

1

Non, je pense que dans C++/CLI vous n'avez pas non plus besoin de la distribution dynamique ici. Derived * est implicitement converti en Base * sauf s'il y a une ambiguïté w.r.t. héritage multiple. La même chose est probablement vrai pour "gc-pointeurs". En C++, un cast dynamique - en upcasting - 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 CLI est par défaut polymorphe.

Vous voudrez peut-être supprimer la balise C++, soit dit en passant. ;)

2

En C++ standard, vous utilisez dynamic_cast pour dévaler la hiérarchie, et non vers le haut. Dans ce cas, vous l'utiliser pour essayer de convertir une IA ou IB en C:

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