Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Penghirisan Objek Boleh Dielakkan Apabila Bekerja dengan Vektor Hierarki Warisan dalam C ?
Vektor dan Polimorfisme dalam C : Penghirisan Objek Terurai
Apabila berurusan dengan vektor hierarki warisan dalam C , seseorang mungkin menghadapi kerumitan halus yang boleh menghalang tingkah laku yang dimaksudkan. Pertimbangkan contoh 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>
Sekarang, bayangkan menyimpan objek Tambah dalam vektor penunjuk kelas asas:
<code class="cpp">void some_method() { vector<Instruction*> v; Instruction* i = new Add(1,2,3) v.push_back(i); }</code>
Kemudian, dalam kaedah yang berasingan, kami cuba menggunakan laksanakan fungsi pada elemen terakhir vektor:
<code class="cpp">void some_other_method() { Instruction ins = v.back(); ins.execute(); }</code>
Salah tanggapan biasa ialah fungsi laksana akan berkelakuan seolah-olah dipanggil pada objek Tambah. Walau bagaimanapun, ini tidak berlaku.
Isu ini berpunca daripada cara vektor menyimpan nilai: mereka menyimpan salinan objek, bukan rujukan. Oleh itu, apabila menolak objek Tambah ke dalam vektor, ia akan disalin, menghasilkan objek jenis Arahan, kehilangan data dan kaedah khusus Tambah. Ini dikenali sebagai penghirisan objek.
Untuk mengelakkan penghirisan objek, kita perlu mengubah suai vektor kita untuk menyimpan rujukan dan bukannya salinan:
<code class="cpp">vector<Instruction*> ins</code>
Sebagai alternatif, kita boleh menggunakan std::reference_wrapper:
<code class="cpp">vector< std::reference_wrapper<Instruction> > ins</code>
Dengan menggunakan rujukan, kami mengekalkan jenis asal objek dalam vektor, membenarkan tingkah laku polimorfik seperti yang diharapkan.
Atas ialah kandungan terperinci Bagaimanakah Penghirisan Objek Boleh Dielakkan Apabila Bekerja dengan Vektor Hierarki Warisan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!