Adakah Penghirisan Objek Mempengaruhi Polimorfisme dalam Vektor C?

Patricia Arquette
Lepaskan: 2024-11-02 05:50:02
asal
759 orang telah melayarinya

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

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

Dalam kelas lain, elemen terakhir vektor diambil dan kaedah laksana dipanggil:

<code class="cpp">Instruction ins = v.back();
ins.execute();</code>
Salin selepas log masuk

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

atau

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!