Rumah >pembangunan bahagian belakang >C++ >Mengapa Casting Base ke Kelas Terbitan dalam C Selalunya Gagal, dan Apakah Alternatif yang Lebih Baik?
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!