L'opérateur Dynamic_cast en C est un outil puissant pour l'identification et le rétrécissement sécurisés du type d'exécution. Examinons sa fonctionnalité et comparons-la avec une implémentation hypothétique en C pour clarifier son objectif.
Considérez l'extrait de code C suivant :
struct A { virtual void f() { } }; struct B : public A { }; struct C { }; void f() { A a; B b; A* ap = &b; B* b1 = dynamic_cast<B*>(&a); // NULL, because 'a' is not a 'B' B* b2 = dynamic_cast<B*>(ap); // 'b' C* c = dynamic_cast<C*>(ap); // NULL. }
Dans cet exemple, Dynamic_cast est utilisé pour effectuer l'identification et la conversion du type d'exécution. Lorsqu'il est appliqué à un pointeur vers un objet de classe de base (ap), il renvoie le pointeur vers un objet de classe dérivé (B) ou NULL si l'objet pointé n'est pas du type cible (C).
C ne fournit pas d'équivalent intégré à Dynamic_cast. Cependant, on peut implémenter une fonctionnalité similaire en utilisant les informations de type d'exécution (RTTI) en combinaison avec une approche de table de fonctions virtuelles (vtable).
struct A { int type_id; // Placeholder for RTTI }; struct B : public A { void f() { printf("B::f\n"); } }; struct C : public A { void f() { printf("C::f\n"); } }; void* dynamic_cast_c(void* pointer, int target_type_id) { A* base = (A*)pointer; if (base->type_id == target_type_id) { return (void*)pointer; } else { return NULL; } } int main() { A a; B b; A* ap = &b; B* b1 = (B*)dynamic_cast_c(ap, sizeof(B)); // Returns &b C* c1 = (C*)dynamic_cast_c(ap, sizeof(C)); // Returns NULL return 0; }
Dans cet exemple C, le membre type_id de la classe de base A sert en remplacement de RTTI, et la vtable définit les fonctions spécifiques au type (par exemple, f()). Dynamic_cast_c vérifie si le pointeur correspond au type cible en comparant le type_id et, si tel est le cas, renvoie le pointeur. Sinon, il renvoie NULL.
Cependant, l'implémentation C n'est pas aussi flexible que Dynamic_cast en C , ce qui permet des scénarios de vérification et de conversion de type plus complexes impliquant des relations d'héritage et un comportement polymorphe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!