Polimorfisme dan Penghirisan dalam C
Dalam C , polimorfisme membolehkan anda mencipta objek dengan fungsi berbeza berdasarkan kelas terbitannya. Walau bagaimanapun, ia boleh membawa kepada tingkah laku aneh jika tidak dikendalikan dengan berhati-hati. Salah satu isu tersebut ialah "menghiris."
Pertimbangkan kod berikut:
#include <iostream> using namespace std; class Animal { public: virtual void makeSound() { cout << "rawr" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "bark" << endl; } }; int main() { Animal animal; animal.makeSound(); Dog dog; dog.makeSound(); Animal badDog = Dog(); badDog.makeSound(); Animal* goodDog = new Dog(); goodDog->makeSound(); }
Output yang anda dapat ialah:
rawr bark rawr bark
Anda mungkin menjangkakan outputnya ialah "kulit kayu mentah kulit kayu", tetapi sebaliknya, objek badDog berkelakuan sebagai Haiwan dan bukannya Anjing. Ini kerana menghiris.
Apabila anda mencipta badDog sebagai Animal badDog = Dog(), anda sedang menghiris objek Dog menjadi Haiwan. Ini bermakna badDog hanya mengandungi bahagian Anjing yang merupakan sebahagian daripada kelas Haiwan dan semua fungsi Anjing tertentu hilang.
Untuk membetulkannya, anda perlu menggunakan penunjuk atau rujukan untuk memperoleh kelas. Penunjuk atau rujukan tidak menyalin objek, jadi mereka boleh mengekalkan fungsi khusus mereka. Contohnya, penunjuk goodDog berjaya mengekalkan fungsi Dognya.
Sesetengah bahasa seperti Java mempunyai semantik rujukan secara lalai, manakala C menggunakan semantik nilai. Dalam C , anda secara eksplisit perlu menggunakan penunjuk atau rujukan untuk mencapai semantik rujukan. Kegagalan berbuat demikian boleh membawa kepada isu penghirisan, seperti yang ditunjukkan dalam contoh badDog.
Atas ialah kandungan terperinci Bagaimanakah Menghiris Mempengaruhi Polimorfisme dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!