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
Lepaskan: 2024-11-28 05:35:22
asal
918 orang telah melayarinya

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

Outputnya ialah:

rawr
bark
rawr
bark
Salin selepas log masuk

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!

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