Pengendali dynamic_cast dalam C ialah alat berkuasa untuk pengecaman jenis masa jalan yang selamat dan penyempitan. Mari kita mendalami fungsinya dan bandingkan dengan pelaksanaan C hipotesis untuk menjelaskan tujuannya.
Pertimbangkan coretan kod C berikut:
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. }
Dalam contoh ini, dynamic_cast digunakan untuk melaksanakan pengecaman dan penghantaran jenis masa jalan. Apabila digunakan pada penuding pada objek kelas asas (ap), ia mengembalikan penuding kepada objek kelas terbitan (B) atau NULL jika objek ditunjuk bukan daripada jenis sasaran (C).
C tidak menyediakan setara terbina dalam kepada dynamic_cast. Walau bagaimanapun, seseorang boleh melaksanakan fungsi yang serupa menggunakan maklumat jenis masa jalan (RTTI) dalam kombinasi dengan pendekatan jadual fungsi maya (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; }
Dalam contoh C ini, ahli type_id kelas asas A berfungsi sebagai pengganti RTTI, dan vtable mentakrifkan fungsi khusus jenis (cth., f()). dynamic_cast_c menyemak sama ada penuding sepadan dengan jenis sasaran dengan membandingkan type_id, dan jika ya, mengembalikan penuding. Jika tidak, ia mengembalikan NULL.
Walau bagaimanapun, pelaksanaan C tidak sefleksibel seperti dynamic_cast dalam C , yang membolehkan senario semakan dan penghantaran jenis yang lebih kompleks melibatkan hubungan warisan dan gelagat polimorfik.
Atas ialah kandungan terperinci Bagaimanakah `dynamic_cast` C Berbeza daripada Pelaksanaan C Hipotesis untuk Pengenalpastian Jenis Masa Jalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!