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; }
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
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>());
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!