Bolehkah Kelas Diwarisi Melaksanakan Fungsi Maya dengan Jenis Pulangan Berbeza?
Dalam pengaturcaraan berorientasikan objek, fungsi maya membenarkan tingkah laku polimorfik di mana subkelas boleh menyediakan pelaksanaan kaedah mereka sendiri yang ditakrifkan dalam kelas asas. Walaupun parameter fungsi maya yang diganti mesti sepadan dengan pelaksanaan kelas asasnya, persoalan timbul: bolehkah jenis pulangan berbeza?
Dalam Jenis Pulangan Kovarian, Jawapannya ialah Ya
Dalam keadaan tertentu, kelas terbitan sememangnya boleh mengatasi fungsi maya dengan jenis pulangan yang berbeza. Ini dibenarkan jika jenis pulangan dalam kelas terbitan ialah kovarian dengan jenis pulangan dalam kelas asas. Kovarians bermaksud jenis pulangan kelas terbitan ialah subjenis, atau terbitan daripada, jenis pulangan kelas asas.
Sebagai contoh, pertimbangkan kod berikut:
class Base { public: virtual ~Base() {} virtual Base* clone() const = 0; }; class Derived: public Base { public: virtual Derived* clone() const { return new Derived(*this); } };
Dalam contoh ini, kelas asas Base mentakrifkan klon fungsi maya tulen yang mengembalikan penunjuk ke Base. Kelas terbitan Derived mengatasi fungsi ini untuk mengembalikan penunjuk kepada Derived. Walaupun jenis pulangan berbeza, ia adalah kovarian kerana Derived ialah subjenis Base.
Pemahaman Konseptual
Apabila memanggil fungsi maya pada penunjuk ke objek kelas asas , pengkompil secara dinamik memilih pelaksanaan yang sesuai berdasarkan jenis objek sebenar. Nilai pulangan bagi fungsi yang diganti masih boleh diberikan kepada pembolehubah jenis kelas asas kerana penukaran penunjuk adalah tersirat dan ditakrifkan dengan baik.
Kesimpulan
Dalam ringkasan, kelas yang diwarisi boleh melaksanakan fungsi maya dengan jenis pulangan yang berbeza jika jenis pulangan adalah kovarian dengan jenis pulangan asal. Ini membolehkan gelagat polimorfik yang selamat di mana kelas terbitan boleh menyediakan pelaksanaan khusus mereka sendiri tanpa mengganggu keserasian jenis yang dijangkakan.
Atas ialah kandungan terperinci Bolehkah Kelas Terbitan Mengatasi Fungsi Maya dengan Jenis Pulangan Kovarian yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!