Potensi Perangkap Berpunca daripada Bekas C STL
Amalan memperoleh daripada bekas Perpustakaan Standard C (STL) telah menjadi subjek perdebatan, dengan beberapa berhujah menentang penggunaannya. Walaupun terdapat kelebihan yang dirasakan, seperti fungsi lebih muatan dan pengkhususan yang membolehkan, terdapat potensi risiko yang dikaitkan dengan pendekatan ini.
Ketiadaan pemusnah maya dalam bekas STL menimbulkan bahaya yang ketara. Apabila memperoleh kelas daripada bekas STL yang tidak mempunyai pemusnah maya, kelas terbitan mungkin tidak dapat mengendalikan tingkah laku polimorfik dengan betul. Ini boleh membawa kepada hasil yang tidak dijangka, terutamanya apabila objek kelas terbitan disimpan dalam bekas dan diakses melalui penunjuk kelas asas.
Untuk menggambarkan, pertimbangkan senario berikut:
#include <vector> void kill_it(std::vector<double> *victim) { delete victim; // Invokes non-virtual ~std::vector<>() } typedef std::vector<double> Rates; class Charges: public std::vector<double> { }; int main() { std::vector<double> *p1, *p2; p1 = new Rates; p2 = new Charges; // Possible error introduced by user code kill_it(p2); kill_it(p1); return 0; }
Dalam contoh ini , fungsi kill_it tidak mempunyai sebarang pengetahuan tentang Caj kelas yang diperolehi. Akibatnya, ia akan menggunakan pemusnah bukan maya bagi kelas asas std::vector
Satu lagi isu berpotensi dengan terbitan daripada bekas STL timbul daripada pelaksanaan kelas vektor oleh Microsoft. Dalam pelaksanaan ini, kelas vektor itu sendiri dilaksanakan melalui pewarisan, dengan vektor<> diterbitkan secara terbuka daripada _Vector_Val<>. Ini menambahkan lapisan tambahan kerumitan dan potensi bahaya apabila bekerja dengan kelas terbitan.
Walaupun mungkin terdapat kelebihan untuk menggunakan warisan dalam senario tertentu, faedah selalunya datang dengan peningkatan kerumitan dan potensi risiko. Komposisi, menggunakan bekas sebagai pembolehubah ahli dan bukannya kelas asas, biasanya diutamakan untuk kejelasan dan untuk mengelakkan potensi isu yang berkaitan dengan terbitan.
Atas ialah kandungan terperinci Patutkah Anda Mewarisi daripada Bekas C STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!