Rumah > pembangunan bahagian belakang > C++ > Bolehkah Vektor Memegang Objek Kelas Terbitan Tanpa Menghiris Objek?

Bolehkah Vektor Memegang Objek Kelas Terbitan Tanpa Menghiris Objek?

Susan Sarandon
Lepaskan: 2024-12-27 02:27:10
asal
496 orang telah melayarinya

Can Vectors Hold Derived Class Objects Without Object Slicing?

Bolehkah Vektor Memegang Objek Kelas Terbitan sebagai Pembolehubah Kelas Asas?

Dalam C , isu yang membingungkan timbul apabila cuba menyimpan objek kelas terbitan dalam vektor yang unsur-unsurnya daripada jenis kelas asas. Seperti dalam contoh yang disediakan:

#include <iostream>
#include <vector>
using namespace std;

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

Daripada mencetak "DERIVED" seperti yang dijangkakan disebabkan oleh penghantaran kaedah maya, kod ini mencetak "BASE." Tingkah laku luar biasa ini berpunca daripada menghiris objek.

Penyebab: Menghiris Objek

Menghiris objek merujuk kepada kehilangan data khusus kelas terbitan apabila menyimpan contoh kelas terbitan dalam pembolehubah jenis kelas asas. Ini kerana pengkompil hanya menyalin bahagian objek yang dikongsi, membuang ahli khusus kelas yang diperolehi.

Cara Alternatif dengan Penunjuk Pintar

Untuk mengatasi penghirisan objek dan mencapai tingkah laku polimorfik, amalan terbaik ialah menyimpan penunjuk kepada objek kelas asas dalam vektor. Ini menghapuskan penghirisan sambil mengekalkan sifat dinamik kaedah kelas terbitan.

vector<Base*> vect;
vect.push_back(&derived); // Store a pointer to the Derived object
Salin selepas log masuk

Cara C: Menggunakan Penunjuk Pintar

Untuk meningkatkan pendekatan berorientasikan objek, adalah disyorkan untuk menggunakan penunjuk pintar dan bukannya penunjuk mentah. Penunjuk pintar mengendalikan pengurusan memori secara automatik, memastikan kod selamat dan bersih.

#include <memory>

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());
Salin selepas log masuk

Atas ialah kandungan terperinci Bolehkah Vektor Memegang Objek Kelas Terbitan Tanpa Menghiris Objek?. 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