Rumah > pembangunan bahagian belakang > C++ > Patutkah Anda Mewarisi daripada Bekas C STL: Risiko dan Alternatif?

Patutkah Anda Mewarisi daripada Bekas C STL: Risiko dan Alternatif?

DDD
Lepaskan: 2024-11-26 14:13:10
asal
1043 orang telah melayarinya

Should You Inherit from C   STL Containers: Risks and Alternatives?

Risiko Terhasil daripada Bekas C STL

Walaupun potensi kelebihan memperoleh kelas daripada bekas C STL, seperti kelebihan beban fungsi, pengkhususan templat , dan penyahpepijatan yang dipertingkatkan, terdapat risiko yang wujud yang berkaitan dengan perkara ini pendekatan.

Pertimbangkan contoh berikut:

#include <vector>

class Rates : public std::vector<double> { };
class Charges : public std::vector<double> { };

int main() {
  auto p1 = new Rates;
  auto p2 = new Charges;
  kill_it(p2); // User code that knows nothing about Rates or Charges
  kill_it(p1);
  return 0;
}
Salin selepas log masuk

Fungsi kill_it memadamkan ingatan mangsa semasa melaksanakan pemusnah bukan maya std::vector. Ini boleh membawa kepada potensi isu dengan Caj (kelas terbitan) tetapi tidak dengan Kadar (jenisdef).

Masalah timbul jika pengguna secara tidak sengaja memperkenalkan ralat dalam fungsi kill_it ??? bahagian. Contohnya, jika pengguna mengubah suai p2 untuk menunjuk ke objek Kadar sebelum memanggil kill_it(p2), pemusnah bukan maya std::vector akan dipanggil, mengakibatkan tingkah laku yang salah.

Untuk mengurangkan risiko ini, secara amnya disyorkan untuk menggunakan komposisi dan bukannya terbitan semasa mengendalikan bekas STL. Komposisi membolehkan pendekatan yang lebih fleksibel dan kurang terdedah kepada ralat.

Atas ialah kandungan terperinci Patutkah Anda Mewarisi daripada Bekas C STL: Risiko dan Alternatif?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan