Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Penghirisan Objek Mempengaruhi Polimorfisme dalam Vektor C?

Adakah Penghirisan Objek Mempengaruhi Polimorfisme dalam Vektor C?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 05:50:02760semak imbas

Does Object Slicing Affect Polymorphism in C   Vectors?

Vektor dan Polimorfisme dalam C

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 simpan salinan rujukan Arahan, bukan rujukan itu sendiri. Ini bermakna apabila objek Tambah ditolak semula ke dalam vektor, salinan rujukan dibuat.

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!

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