Masalah:
Pertimbangkan coretan kod C 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>
Vektor rujukan Arahan dibuat dan objek Tambah ditambahkan pada vektor dengan menolak semula nilai dinyahrujuknya:
<code class="cpp">vector<Instruction> v; Instruction* i = new Add(1,2,3); v.push_back(*i);</code>
Dalam kelas lain, elemen terakhir vektor diambil dan kaedah laksana dipanggil:
<code class="cpp">Instruction ins = v.back(); ins.execute();</code>
Soalan:
Adakah kaedah laksana mengekalkan jenis Tambahnya dan adakah kod tersebut akan dilaksanakan dengan betul?
Jawapan:
Tidak, tidak.
Vektor
Selain itu, pengendali baharu digunakan untuk memperuntukkan memori untuk objek Tambah. Walau bagaimanapun, memandangkan objek tidak dipadamkan, kebocoran memori berlaku.
Untuk melaksanakan senario ini dengan betul, seseorang harus menggunakan vektor Arahan* atau std::reference_wrapper
<code class="cpp">vector<Instruction*> ins;</code>
atau
<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
Nota Tambahan:
Tingkah laku yang diterangkan dalam masalah ini dikenali sebagai penghirisan objek.
Atas ialah kandungan terperinci Adakah Penghirisan Objek Mempengaruhi Polimorfisme dalam Vektor C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!