Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Penghirisan Objek Boleh Dielakkan Apabila Bekerja dengan Vektor Hierarki Warisan dalam C ?

Bagaimanakah Penghirisan Objek Boleh Dielakkan Apabila Bekerja dengan Vektor Hierarki Warisan dalam C ?

DDD
DDDasal
2024-11-01 09:00:03947semak imbas

How Can Object Slicing Be Avoided When Working with Vectors of Inheritance Hierarchies in 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!

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