Rumah > pembangunan bahagian belakang > C++ > Mengapa Polimorfisme Tidak Berfungsi dengan Vektor Objek Arahan dalam C ?

Mengapa Polimorfisme Tidak Berfungsi dengan Vektor Objek Arahan dalam C ?

Barbara Streisand
Lepaskan: 2024-11-02 14:41:29
asal
689 orang telah melayarinya

Why Doesn't Polymorphism Work with a Vector of Instruction Objects in C  ?

Vektor dan Polimorfisme dalam C

Polymorphism membenarkan objek dari kelas yang berbeza berkongsi antara muka yang sama. Dalam C , ini biasanya dicapai melalui fungsi warisan dan maya.

Pertimbangkan coretan kod 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

Di sini, kelas Arahan mentakrifkan kaedah pelaksanaan maya, yang ditindih dalam Tambah kelas.

Sekarang, mari buat vektor yang mengandungi Arahan objek:

<code class="cpp">vector<Instruction> v;
Instruction* i = new Add(1,2,3);
v.push_back(*i);</code>
Salin selepas log masuk

Dalam kaedah lain, kami mendapatkan semula elemen terakhir vektor dan memanggil kaedah pelaksanaannya:

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

Adakah ia berfungsi?

Tidak, tidak. Vektor menyimpan nilai, bukan rujukan. Ini bermakna objek Tambah akan disalin ke dalam vektor, mengakibatkan penghirisan objek.

Cara membetulkannya

Untuk mengekalkan polimorfisme, kita perlu menggunakan vektor daripada petunjuk:

<code class="cpp">vector<Instruction*> v;
v.push_back(i);</code>
Salin selepas log masuk

Sebagai alternatif, kita boleh menggunakan vektor std::reference_wrapper:

<code class="cpp">vector<std::reference_wrapper<Instruction>> v;
v.push_back(i);</code>
Salin selepas log masuk

Ini memastikan objek tidak dihiris, membolehkan kami mengekalkan jenis dinamiknya dan memanggil fungsi maya dengan betul.

Atas ialah kandungan terperinci Mengapa Polimorfisme Tidak Berfungsi dengan Vektor Objek Arahan 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan