Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Hantar dengan Selamat ke Kelas Terbitan dalam C?

Bagaimanakah Saya Boleh Hantar dengan Selamat ke Kelas Terbitan dalam C?

Linda Hamilton
Lepaskan: 2024-11-25 12:56:18
asal
693 orang telah melayarinya

How Can I Safely Cast to Derived Classes in C  ?

Mengatasi Yang Mustahil: Menghantar ke Kelas Terbitan dalam C

Memutuskan ke kelas terbitan dalam C boleh menjadi tugas yang sukar, selalunya mengakibatkan "Tidak boleh menukar dari BaseType" yang digeruni kepada ralat DerivedType". Walau bagaimanapun, dengan memahami selok-belok pengaturcaraan berorientasikan objek, adalah mungkin untuk melaksanakan penukaran ini dengan berkesan.

Bahan Dinamik untuk Polimorfisme Objek

Dalam C , dynamic_cast digunakan kepada kelas terbitan upcast atau downcast kepada kelas asasnya atau sebaliknya. Pemutus dinamik ini membenarkan polimorfisme objek, di mana objek daripada kelas terbitan berbeza boleh dianggap sebagai kelas asas biasa mereka.

Animal& animalRef = dynamic_cast<Animal&>(dog); // Upcast Dog to Animal
Salin selepas log masuk

Kepentingan Ahli Maya

Maya kaedah memainkan peranan penting dalam tuangan dinamik. Apabila kelas asas mempunyai fungsi ahli maya, ia memastikan bahawa pelaksanaan yang betul bagi fungsi itu digunakan, walaupun apabila objek kelas asas diakses melalui penuding atau rujukan kelas terbitan.

class Animal {
public:
    virtual void MakeNoise() const = 0; // Pure virtual function
};

class Dog : public Animal {
public:
    void MakeNoise() const override { std::cout << "Woof!" << std::endl; }
};
Salin selepas log masuk

Dalam contoh ini , memanggil MakeNoise() pada objek Haiwan yang sebenarnya Anjing akan menggunakan pelaksanaan Anjing, membenarkan polimorfik tingkah laku.

Kaveat Pemutus Dinamik

Pemutus dinamik bukan tanpa hadnya. Apabila menghantar objek kelas asas kepada kelas terbitan yang tidak berkongsi nenek moyang yang sama, pengecualian akan dilemparkan. Selain itu, NULL dikembalikan jika lakonan dinamik gagal.

// Throws an exception
Animal* animal = new Dog();
Dog* dog = dynamic_cast<Dog*>(animal);

// Returns NULL
Animal* animal = new Cat();
Dog* dog = dynamic_cast<Dog*>(animal);
Salin selepas log masuk

Alternatif kepada Hantaran Dinamik

Dalam kebanyakan kes, sebaiknya gunakan kaedah maya untuk mengakses sifat dan tingkah laku kelas terbitan. Ini mengurangkan keperluan untuk tuangan dinamik dan memastikan kebolehselenggaraan.

Kesimpulan

Memahami konsep dan had tuangan dinamik adalah penting untuk hierarki kelas yang berkesan dalam C . Dengan menggunakan kaedah maya dan mempertimbangkan potensi pengecualian, adalah mungkin untuk mengatasi ralat "Tidak boleh menukar daripada BaseType kepada DerivedType" dan mencapai polimorfisme objek yang cekap dalam kod anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Hantar dengan Selamat ke Kelas Terbitan 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