Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Casting Dinamik ke Kelas Terbitan dengan Selamat dalam C?

Bagaimana untuk Melaksanakan Casting Dinamik ke Kelas Terbitan dengan Selamat dalam C?

Barbara Streisand
Lepaskan: 2024-12-01 11:42:14
asal
680 orang telah melayarinya

How to Safely Perform Dynamic Casting to Derived Classes in C  ?

Pemutus Dinamik kepada Kelas Terbitan dalam C

Tuangan dinamik ialah teknik yang digunakan untuk menukar objek daripada kelas asas kepada kelas terbitan. Walau bagaimanapun, ini boleh membawa kepada ralat jika objek bukan jenis yang betul.

Masalah:

Percubaan untuk menghantar objek kelas asas kepada hasil kelas terbitan dalam ralat: "Tidak boleh menukar daripada BaseType kepada DerivedType. Tiada pembina boleh mengambil jenis sumber, atau resolusi bebanan pembina telah samar-samar."

BaseType m_baseType;

DerivedType m_derivedType = m_baseType; // Error
DerivedType m_derivedType = (DerivedType)m_baseType; // Error
DerivedType * m_derivedType = (DerivedType*) &m_baseType; // Error
Salin selepas log masuk

Penyelesaian:

Memahami konsep berorientasikan objek adalah penting untuk mengelakkan ralat ini. Pertimbangkan hierarki haiwan berikut:

class Animal { /* Virtual members */ };
class Dog : public Animal {};
class Cat : public Animal {};
Salin selepas log masuk

Peraturan Casting:

  • Upcasting (Asas kepada Terbitan): Dibenarkan secara tersirat, sebagai objek terbitan juga merupakan asas objek.
  • Menurun (Diperoleh ke Pangkalan): Memerlukan dynamic_cast<> pengendali. Mengembalikan NULL jika objek bukan jenis yang betul.

Contoh:

Dog     dog;
Cat     cat;
Animal& AnimalRef1 = dog;  // Upcasting OK
Animal& AnimalRef2 = cat;  // Upcasting OK
Animal* AnimalPtr1 = &dog; // Upcasting OK
Animal* AnimalPtr2 = &cat; // Upcasting OK

Cat&    catRef1 = dynamic_cast<Cat&>(AnimalRef1);  // Throws exception (not a cat)
Cat*    catPtr1 = dynamic_cast<Cat*>(AnimalPtr1);  // Returns NULL (not a cat)
Cat&    catRef2 = dynamic_cast<Cat&>(AnimalRef2);  // Succeeds
Cat*    catPtr2 = dynamic_cast<Cat*>(AnimalPtr2);  // Succeeds
Salin selepas log masuk

Nota Penting:

Pemutus dinamik harus digunakan dengan berhati-hati, terutamanya apabila bekerja dengan hierarki warisan. Sebaliknya, pilih kaedah maya untuk polimorfisme dan mengakses sifat objek.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Casting Dinamik ke Kelas Terbitan dengan Selamat dalam C?. 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