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
Lepaskan: 2024-12-01 15:29:15
asal
431 orang telah melayarinya

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan