Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `dynamic_cast` C berbeza daripada `static_cast` dalam Runtime Type Checking?

Bagaimanakah `dynamic_cast` C berbeza daripada `static_cast` dalam Runtime Type Checking?

Susan Sarandon
Susan Sarandonasal
2024-12-01 15:29:15524semak imbas

How Does C  's `dynamic_cast` Differ from `static_cast` in Runtime Type Checking?

Memahami dynamic_cast dalam C

dynamic_cast, seperti namanya, membolehkan semakan jenis masa jalan untuk penuding dan penukaran rujukan dalam C . Tidak seperti static_cast, yang melakukan penukaran masa kompilasi, dynamic_cast membuat pengesahan pada masa pelaksanaan.

Untuk memahami konsep dynamic_cast dalam C , mari kita bandingkannya dengan bahasa C.

static_cast

static_cast<Type*>(ptr);

Ini melakukan penukaran jenis daripada ptr ke Taip* pada masa penyusunan. Walau bagaimanapun, ia menganggap jenis itu berkaitan dan memerlukannya supaya serasi. Jika penukaran tidak sah, atur cara akan gagal untuk menyusun.

dynamic_cast

dynamic_cast<Type*>(ptr);

Sama seperti static_cast, dynamic_cast cuba menukar penunjuk ptr kepada Type* . Walau bagaimanapun, penukaran ini berlaku pada masa jalan. Ini membolehkan lebih fleksibiliti, terutamanya apabila berurusan dengan pewarisan dan polimorfisme.

Dalam contoh yang disediakan:

  • dynamic_cast(ap) berjaya menukar ap kepada B* kerana B berasal daripada A.
  • dynamic_cast(ap) dan dynamic_cast(b) juga berfungsi dengan betul.
  • dynamic_cast(ap) mengembalikan NULL kerana C bukan berasal daripada A.
  • Untuk rujukan, dynamic_cast(&*ap) kedua-duanya berjaya, manakala dynamic_cast(&*ap) melontarkan pengecualian std::bad_cast.

Peraturan untuk Dynamic_cast:

  • Asas -to-derived (B2D) Casts: Cast ini sentiasa mengembalikan yang sah penunjuk jika penunjuk menunjuk ke objek jenis yang ditentukan. Jika penuding tidak menghala ke objek jenis yang betul, penuding NULL dikembalikan.
  • Bahan Terbitan ke asas (D2B): Barisan ini sentiasa berjaya dan mengembalikan a penunjuk yang sah. Pengecualian berlaku apabila cuba menghantar penuding kosong kepada jenis terbitan, yang menghasilkan penuding NULL.

Ingat bahawa untuk tuangan asas kepada terbitan, kelas yang terlibat mestilah polimorfik. Ini bermakna mereka mesti mempunyai sekurang-kurangnya satu fungsi maya yang diisytiharkan dalam kelas asas mereka.

Atas ialah kandungan terperinci Bagaimanakah `dynamic_cast` C berbeza daripada `static_cast` dalam Runtime Type Checking?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn