Rumah >pembangunan bahagian belakang >C++ >Mengapa Casting Base ke Kelas Terbitan dalam C Selalunya Gagal, dan Apakah Alternatif yang Lebih Baik?

Mengapa Casting Base ke Kelas Terbitan dalam C Selalunya Gagal, dan Apakah Alternatif yang Lebih Baik?

Linda Hamilton
Linda Hamiltonasal
2024-11-29 09:27:11715semak imbas

Why Does Casting Base to Derived Classes in C   Often Fail, and What are the Better Alternatives?

Menghantar ke Kelas Terbitan dalam C

Persoalannya berkisar tentang ketidakupayaan untuk menghantar objek jenis asas kepada jenis terbitan. Pendekatan yang disediakan mengakibatkan ralat kerana kehilangan pembina yang sah atau penyelesaian pembina yang tidak jelas.

Memahami konsep pewarisan adalah penting di sini. Fikirkan hierarki haiwan:

class Animal { /* Some virtual members */ };
class Dog: public Animal {};
class Cat: public Animal {};

Menetapkan objek jenis asas (cth., Haiwan) kepada pembolehubah jenis terbitan (cth., Anjing) berfungsi tanpa menghantar kerana semua haiwan sememangnya tergolong dalam kategori jenis asas. Walau bagaimanapun, cubaan menghantar objek jenis terbitan kembali ke objek jenis asas (cth., Anjing kepada Haiwan) tanpa menggunakan tuangan dinamik akan mengakibatkan penghirisan, kehilangan data khusus jenis terbitan.

Tuangan dinamik menyediakan cara yang selamat untuk menghantar objek jenis terbitan kembali ke bekas jenis asas di mana objek disimpan polimorfik:

std::vector<Animal*> barnYard;
barnYard.push_back(&dog);
barnYard.push_back(&cat);
barnYard.push_back(&duck);
barnYard.push_back(&chicken);

Dog* dog = dynamic_cast<Dog*>(barnYard[1]); // Note: NULL as this was the cat.

Walau bagaimanapun, menggunakan tuangan dinamik selalunya menunjukkan kecacatan reka bentuk. Sebaliknya, pertimbangkan untuk menggunakan kaedah maya untuk mengakses sifat secara dinamik:

void makeNoise(Animal& animal) { animal.DoNoiseMake(); }
Dog dog;
Cat cat;
Duck duck;
Chicken chicken;

makeNoise(dog);
makeNoise(cat);
makeNoise(duck);
makeNoise(chicken);

Atas ialah kandungan terperinci Mengapa Casting Base ke Kelas Terbitan dalam C Selalunya Gagal, dan Apakah Alternatif yang Lebih Baik?. 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