Rumah > Artikel > pembangunan bahagian belakang > Mengapa Polimorfisme Tidak Berfungsi dengan Vektor Objek Arahan dalam C ?
Vektor dan Polimorfisme dalam C
Polymorphism membenarkan objek dari kelas yang berbeza berkongsi antara muka yang sama. Dalam C , ini biasanya dicapai melalui fungsi warisan dan maya.
Pertimbangkan coretan kod berikut:
<code class="cpp">class Instruction { public: virtual void execute() { } }; class Add: public Instruction { private: int a; int b; int c; public: Add(int x, int y, int z) {a=x;b=y;c=z;} void execute() { a = b + c; } };</code>
Di sini, kelas Arahan mentakrifkan kaedah pelaksanaan maya, yang ditindih dalam Tambah kelas.
Sekarang, mari buat vektor yang mengandungi Arahan objek:
<code class="cpp">vector<Instruction> v; Instruction* i = new Add(1,2,3); v.push_back(*i);</code>
Dalam kaedah lain, kami mendapatkan semula elemen terakhir vektor dan memanggil kaedah pelaksanaannya:
<code class="cpp">Instruction ins = v.back(); ins.execute();</code>
Adakah ia berfungsi?
Tidak, tidak. Vektor menyimpan nilai, bukan rujukan. Ini bermakna objek Tambah akan disalin ke dalam vektor, mengakibatkan penghirisan objek.
Cara membetulkannya
Untuk mengekalkan polimorfisme, kita perlu menggunakan vektor daripada petunjuk:
<code class="cpp">vector<Instruction*> v; v.push_back(i);</code>
Sebagai alternatif, kita boleh menggunakan vektor std::reference_wrapper
<code class="cpp">vector<std::reference_wrapper<Instruction>> v; v.push_back(i);</code>
Ini memastikan objek tidak dihiris, membolehkan kami mengekalkan jenis dinamiknya dan memanggil fungsi maya dengan betul.
Atas ialah kandungan terperinci Mengapa Polimorfisme Tidak Berfungsi dengan Vektor Objek Arahan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!