Rumah >pembangunan bahagian belakang >C++ >Mengapa Penghirisan Berlaku dalam Polimorfisme C, dan Bagaimana Ia Boleh Dielakkan?

Mengapa Penghirisan Berlaku dalam Polimorfisme C, dan Bagaimana Ia Boleh Dielakkan?

Patricia Arquette
Patricia Arquetteasal
2024-11-28 05:35:221000semak imbas

Why Does Slicing Occur in C   Polymorphism, and How Can It Be Avoided?

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!

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