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
DDDasal
2024-11-26 14:13:101060semak imbas

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

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!

Kenyataan:
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