Polimorfisme dalam Templat C
Dalam C , polimorfisme ialah konsep asas yang membenarkan kelas terbitan mewarisi dan mengatasi kaedah kelas asasnya. Walau bagaimanapun, apabila ia berkaitan dengan templat, polimorfisme bertindak dengan cara yang tidak tradisional.
Isu Kovarian Templat
Pertimbangkan kod berikut:
<code class="cpp">class Interface {
// ...
};
class Foo : public Interface {
// ...
};
template <class T>
class Container {
// ...
};
Bar(const Container<Interface>& bar){
// ...
}</code>
Jika anda cuba membina Bar menggunakan Container, anda akan menghadapi ralat "tiada fungsi padanan". Ini kerana templat C bukan kovarian, bermakna Container tidak boleh ditukar secara tersirat kepada Container.
Reasoning Behind Invariance
Invarians templat wujud atas sebab yang penting. Pertimbangkan vektor templat kelas yang menyimpan objek jenis T. Jika templat adalah kovarian, adalah mungkin untuk menetapkan vektor kepada vektor dan seterusnya menambah objek jenis Jingga (berasal daripada Buah) pada vektor. Ini akan melanggar keselamatan jenis, sebagai vektor bertujuan untuk menyimpan buah-buahan dan bukan oren.
Penyelesaian
Untuk menangani isu ini, beberapa penyelesaian tersedia:
-
Invarian Tegas: Anda boleh menggunakan penegasan statik untuk mengesahkan bahawa hujah templat ialah jenis yang dijangkakan.
-
Gunakan Kad Liar Sempadan (Java): Java menawarkan kad bebas sempadan yang membolehkan anda tentukan sempadan atas atau bawah pada hujah templat, memastikan keserasian dengan jenis lain.
-
Gunakan Kekangan (C#): C# menyediakan kekangan yang membolehkan anda mengenakan sekatan pada hujah templat berdasarkan warisan atau pelaksanaan antara muka.
-
Konsep (C 1x): Piawaian C 1x yang akan datang akan memperkenalkan Concepts, mekanisme yang lebih berkuasa untuk menguatkuasakan keperluan pada parameter templat.
Kesimpulan
Walaupun templat dalam C bukan kovarian, pelbagai penyelesaian wujud untuk memastikan keselamatan jenis dan keserasian antara kelas dan templat. Memahami alasan di sebalik invarian templat adalah penting untuk menulis kod C yang mantap dan betul.
Atas ialah kandungan terperinci Bagaimanakah Polimorfisme Berfungsi dengan Templat dalam C?. 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