Templat Polimorfisme: Memahami Had
Dalam pengaturcaraan berorientasikan objek, pewarisan menyediakan mekanisme untuk polimorfisme, membenarkan kelas terbitan mewarisi dan menimpa kaedah daripada kelas asas. Konsep serupa boleh digunakan pada templat dalam C , ciri berkuasa yang membolehkan penggunaan semula kod dengan menyediakan pelan tindakan generik untuk jenis yang berbeza. Walau bagaimanapun, tidak seperti warisan, polimorfisme templat tidak wujud dalam bahasa.
Isu: Fungsi Tidak Padanan
Apabila cuba menggunakan pembina templat kelas dengan parameter iaitu kelas terbitan bagi parameter templat yang dijangkakan, ralat "tiada fungsi padanan" berlaku. Ini kerana templat tidak mewarisi gelagat kelas asasnya secara automatik.
Memahami Bukan Kovarian Templat
Templat dalam C bukan kovarian, bermakna ia tidak mewarisi hubungan antara parameter mereka. Dalam erti kata lain, T tidak dianggap sebagai pengkhususan T, walaupun B mewarisi daripada A.
Akibat Bukan Kovarian
The kekurangan kovarians templat memastikan keselamatan jenis. Pertimbangkan contoh berikut:
<code class="cpp">class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple> apple_vec; std::vector<Fruit> &fruit_vec = apple_vec; fruit_vec.push_back(Orange()); // Type mismatch</code>
Jika templat adalah kovarian, kod di atas akan membenarkan penambahan Jingga pada bakul epal, menjejaskan keselamatan jenis.
Penyelesaian
Untuk menyelesaikan isu, anda boleh sama ada:
Pendekatan Alternatif dalam Bahasa Lain
Sesetengah bahasa, seperti Java dan C#, menyediakan mekanisme untuk kovarians templat. Walau bagaimanapun, C kekurangan ciri ini kerana kebimbangan tentang keselamatan jenis.
Kesimpulan
Polymorfisme templat ialah alat yang berharga dalam C , tetapi adalah penting untuk memahami batasannya dan elakkan andaian tentang hubungan warisan antara parameter templat. Penyelesaian yang digariskan di atas menyediakan alternatif praktikal untuk mencapai kefungsian yang diingini sambil mengekalkan keselamatan jenis.
Atas ialah kandungan terperinci Bolehkah Polimorfisme Templat dalam C Mewarisi Gelagat daripada Kelas Asas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!