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; }
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*>
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>>
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!