Malgré les erreurs de syntaxe, vous ne pouvez pas dynamic_cast
un type non polymorphe. static_cast
est le cast que vous utiliserez dans ce cas, si vous savez qu'il s'agit en fait d'un objet du type cible.
La raison en est que : static_cast
permet au compilateur d'effectuer une vérification au moment de la compilation "L'entrée peut-elle être convertie en sortie ? Cela peut être utilisé dans les cas où vous effectuez un casting vers le haut ou vers le bas d'une hiérarchie d'héritage de pointeurs (ou de références). Mais la vérification n'a lieu qu'au moment de la compilation, et le compilateur suppose que vous savez ce que vous faites.
dynamic_cast
ne peut être utilisé que dans le cas d'un transfert de pointeur ou de référence, et en plus de la vérification à la compilation, il effectue une vérification supplémentaire à l'exécution pour s'assurer que le transfert est légal. Elle exige que la classe en question ait au moins une méthode virtuelle, ce qui permet au compilateur (s'il prend en charge RTTI) d'effectuer cette vérification supplémentaire. Toutefois, si le type en question ne possède aucune méthode virtuelle, il ne peut pas être utilisé.
Le cas le plus simple, et probablement utile si vous faites circuler des pointeurs comme ceci, est d'envisager de rendre virtuel le destructeur de la classe de base. En plus de vous permettre d'utiliser le cast dynamique, cela permet également aux destructeurs appropriés d'être appelés lorsqu'un pointeur de la classe de base est supprimé.
0 votes
En plus de la réponse acceptée, vous pouvez vérifier cette question : Quand faut-il utiliser static_cast, dynamic_cast et reinterpret_cast ? ( stackoverflow.com/questions/332030/ )