Polymorphism and Slicing in C : Decoding the Confusion
Dalam C , polimorfisme membenarkan objek yang diperoleh daripada kelas asas untuk mempamerkan gelagat yang berbeza. Walau bagaimanapun, perangkap biasa, dikenali sebagai "menghiris", boleh membawa kepada hasil yang tidak dijangka.
Soalan:
Pertimbangkan coretan kod berikut:
class Animal { virtual void makeSound() { cout << "rawr" << endl; } }; class Dog : public Animal { 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(); }
Outputnya ialah:
rawr bark rawr bark
Mengapakah output untuk badDog tidak cetak "kulit kayu"?
Jawapan:
Ini adalah contoh menghiris. Apabila anda menghantar objek Anjing kepada pembina Haiwan (seperti dalam badDog = Dog()), bahagian Haiwan Anjing itu disalin ke dalam badDog. Walau bagaimanapun, memandangkan badDog adalah jenis Animal, ia hanya boleh mengakses kaedah Animal, yang lalai untuk mencetak "rawr."
Untuk mencapai polimorfisme, anda mesti menggunakan penunjuk atau rujukan untuk menunjuk ke objek kelas terbitan. Dalam kes ini, goodDog ialah penunjuk kepada objek Anjing, jadi ia boleh mengakses kaedah Anjing dan mencetak "kulit kayu."
Implikasi:
Menghiris boleh membawa kepada tingkah laku yang tidak dijangka dan secara amnya tidak digalakkan. Menggunakan penunjuk atau rujukan memastikan tingkah laku polimorfik yang betul.
Selain itu, ingat bahawa C menggunakan semantik nilai secara lalai, bermakna pembolehubah mengandungi objek sebenar. Ini berbeza daripada semantik rujukan dalam bahasa seperti Java dan C#, dengan pembolehubah memegang rujukan kepada objek.
Atas ialah kandungan terperinci Mengapa Penghirisan Berlaku dalam Polimorfisme C, dan Bagaimana Ia Boleh Dielakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!