Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengelak Penghirisan Objek Apabila Menggunakan Pewarisan dengan Vektor C?

Bagaimanakah Saya Boleh Mengelak Penghirisan Objek Apabila Menggunakan Pewarisan dengan Vektor C?

Susan Sarandon
Lepaskan: 2024-12-16 16:16:12
asal
794 orang telah melayarinya

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

Penghirisan Objek dan Polimorfisme dalam Bekas Vektor

Apabila berurusan dengan warisan dalam C , kadangkala wajar untuk menyimpan contoh kelas terbitan dalam bekas seperti vektor. Walau bagaimanapun, pendekatan mudah menggunakan vektor untuk menyimpan objek kelas asas boleh membawa kepada penghirisan objek, di mana data khusus kelas yang diperolehi hilang.

Pertimbangkan atur cara berikut:

class Base {
public:
    virtual void identify() {
        cout << "BASE" << endl;
    }
};

class Derived : public Base {
public:
    virtual void identify() {
        cout << "DERIVED" << endl;
    }
};

int main() {
    Derived derived;

    vector<Base> vect;
    vect.push_back(derived);

    vect[0].identify();
    return 0;
}
Salin selepas log masuk

The kod mencipta vektor objek Base dan menyimpan contoh kelas Terbitan. Walau bagaimanapun, apabila memanggil kaedah identify() pada objek yang disimpan, ia mencetak "BASE" dan bukannya "DERIVED." Ini kerana penghirisan objek berlaku apabila objek Terbitan diperuntukkan kepada elemen vektor Asas, mengakibatkan kehilangan data khusus terbitan.

Untuk mengelakkan penghirisan objek dan mengekalkan tingkah laku polimorfik, penyelesaian pilihan adalah menggunakan penunjuk untuk asas objek kelas dalam vektor:

vector<Base*>
Salin selepas log masuk

Ini memastikan bahawa data khusus kelas yang diperoleh tetap utuh. Selain itu, untuk mengelakkan pengurusan memori manual, penunjuk pintar boleh digunakan:

vector<std::shared_ptr<Base>>
Salin selepas log masuk

Petunjuk pintar memastikan pengurusan memori automatik melalui RAII (Pemerolehan Sumber Adalah Permulaan), menjadikannya pendekatan yang lebih mantap dan menepati C.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelak Penghirisan Objek Apabila Menggunakan Pewarisan dengan 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