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
Lepaskan: 2024-11-29 09:27:11
asal
798 orang telah melayarinya

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

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

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

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 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