Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
lang:cpp:cast [2023/06/23 16:48] – [dynamic_cast] : précision sur les références root | lang:cpp:cast [2025/07/28 13:07] (Version actuelle) – [dynamic_cast] : précision sur la vitesse des dynamic_cast root |
---|
| |
''dynamic_cast'' permet de vérifier que le ''static_cast'' est possible. Il est nécessaire que la classe soit polymorphique (au moins une méthode virtuelle). | ''dynamic_cast'' permet de vérifier que le ''static_cast'' est possible. Il est nécessaire que la classe soit polymorphique (au moins une méthode virtuelle). |
| |
| Le ''dynamic_cast'' utilise le pointeur de la table virtuel de l'objet et analyse une table contenant tous les pointeurs de tables virtuels. Si le programme est très gros et contient beaucoup de classes polymorphiques, le ''dynamic_cast'' peut être lent s'il est appelé très fréquemment. C'est pour cette raison que certains programmes implémentent une méthode virtuelle ''get_type'' qui renvoie un ''enum'' pour vérifier si le cast est possible. |
| |
| [[https://thewayofc.blogspot.com/2007/09/alternative-ways-to-implement-downcasts.html| Alternative ways to implement downcasts]] {{ :lang:cpp:cast:the_way_of_c_c_alternative_ways_to_implement_downcasts_7_28_2025_1_06_49_pm_.html |Archive du 11/09/2007 le 28/07/2025}} |
| |
<code cpp> | <code cpp> |
Les classes A et B étant identiques, il est normal que le programme s'exécute correctement. | Les classes A et B étant identiques, il est normal que le programme s'exécute correctement. |
| |
Mais avec un sanitizer ''clang++ -fsanitize=undefined main.cc -o a.out -flto -fvisibility=hidden'' : | Mais avec un sanitizer ''clang++ -fsanitize=undefined -fno-sanitize-recover=all main.cc -o a.out -flto -fvisibility=hidden'' : |
| |
main.cc:17:13: runtime error: member call on address 0x7ffc03ba2878 which does not point to an object of type 'B' | main.cc:17:13: runtime error: member call on address 0x7ffc03ba2878 which does not point to an object of type 'B' |