Rumah > pembangunan bahagian belakang > C++ > Patutkah Anda Mewarisi daripada Bekas C STL?

Patutkah Anda Mewarisi daripada Bekas C STL?

Barbara Streisand
Lepaskan: 2024-12-01 11:58:11
asal
933 orang telah melayarinya

Should You Inherit from C   STL Containers?

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;
}
Salin selepas log masuk

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, yang mungkin membawa kepada kelakuan tidak ditentukan apabila memusnahkan objek jenis Caj. Tingkah laku ini tidak akan berlaku jika Caj dilaksanakan sebagai alias jenis atau typedef, seperti yang dilihat dengan Kadar.

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!

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