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
Lepaskan: 2024-11-01 09:00:03
asal
945 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Sebagai alternatif, kita boleh menggunakan std::reference_wrapper:

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan