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
Barbara Streisandasal
2024-11-02 14:41:29644semak imbas

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>

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>

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

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

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>

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

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

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!

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