Cara Melakukan "Downcasting" dengan unique_ptr
Dalam senario pengaturcaraan tertentu, anda mungkin menghadapi keperluan untuk menukar unique_ptr kelas asas kepada unique_ptr kelas terbitan. Ini dikenali sebagai "menghancurkan." Memahami cara melaksanakan operasi ini dengan berkesan adalah penting untuk mengekalkan keselamatan jenis dan mengelakkan kemungkinan ralat.
Pertimbangkan situasi di mana anda mempunyai kilang yang mengembalikan unique_ptr kelas asas. Walau bagaimanapun, kilang ini berfungsi secara dalaman dengan penunjuk kepada pelbagai jenis terbitan, seperti DerivedA, DerivedB dan sebagainya. Anda mungkin memerlukan cara untuk menukar kelas asas yang dikembalikan unique_ptr kepada tahap kelas terbitan tertentu, seperti yang digambarkan dalam pseudokod berikut:
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
Walaupun pendekatan ini mungkin kelihatan intuitif, ia boleh membawa kepada ralat masa jalan atau tidak dijangka tingkah laku. Penyelesaian yang lebih mantap dan disyorkan melibatkan pelepasan objek daripada kelas asas unique_ptr dan kemudian menghantar penuding mentah kepada jenis terbitan yang diingini, seperti yang ditunjukkan di bawah:
unique_ptr<Derived> CastToDerived(Base* obj) { return unique_ptr<Derived>(static_cast<Derived*>(obj)); }
Dengan menggunakan teknik ini, anda boleh melakukan downcasting dengan selamat tanpa menjejaskan keselamatan jenis. Walau bagaimanapun, perlu diingat bahawa operasi keluaran harus dilakukan secara eksplisit oleh pemanggil sebelum menggunakan fungsi CastToDerived.
Untuk memenuhi senario di mana kilang berada dalam DLL yang dimuatkan secara dinamik, anda mungkin perlu mempertimbangkan untuk menggunakan templat fungsi seperti static_unique_ptr_cast dan dynamic_unique_ptr_cast. Templat ini memastikan bahawa objek yang dihasilkan dimusnahkan dalam konteks yang sama di mana ia dicipta. Selain itu, mereka menawarkan dua varian pemutus:
Atas ialah kandungan terperinci Bagaimana untuk Menurunkan `unique_ptr` dengan Selamat kepada Jenis Terbitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!