Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Perlu Mengelakkan Mewarisi daripada `std::string`?
Mengapa Tidak Disarankan Mewarisi daripada std::string
Dalam Effective C , penekanan diberikan pada fakta bahawa sesuatu maya pemusnah adalah penting untuk keupayaan kelas untuk mempamerkan tingkah laku polimorfik. Oleh itu, ketiadaan pemusnah maya dalam std::string, secara berkesan melarang terbitan daripadanya. Ini membawa kita kepada soalan: Apakah kriteria tambahan yang mesti dipenuhi oleh kelas untuk melayakkan diri sebagai kelas asas yang sesuai?
Kelayakan untuk Status Kelas Asas
Bertentangan dengan andaian yang tersirat dalam soalan itu, kelas tidak perlu menyokong polimorfisme untuk berfungsi sebagai kelas asas. Warisan dalam C mempunyai dua tujuan utama:
std::string sebagai Kelas Asas
Alasannya melampaui kekurangan pemusnah maya. std::string tidak pernah dimaksudkan untuk berfungsi sebagai kelas asas, polimorfik atau sebaliknya. Ini boleh dikaitkan dengan sifat kelas dalam C .
Tidak seperti bahasa berorientasikan objek lain yang kelas adalah jenis rujukan, C menganggap kelas sebagai jenis nilai. Akibatnya, apabila objek kelas asas disalin, hanya ahlinya disalin, bukan kelas terbitan mana-mana. Fenomena ini, yang dikenali sebagai masalah penghirisan, boleh membawa kepada ketidakkonsistenan dan tingkah laku yang salah.
Oleh itu, daripada melaksanakan pewarisan untuk sambungan kaedah, ia dianggap sebagai amalan terbaik dalam C untuk menggunakan fungsi bukan rakan dan bukan ahli atau gubahan. Warisan hendaklah dikhaskan untuk pengaturcaraan meta templat atau mewujudkan tingkah laku polimorfik.
Mencegah Warisan Bukan Polimorfik
Dalam keadaan di mana kelas asas bertujuan semata-mata untuk kebolehgunaan semula kod, terdapat tiada cara yang berkesan untuk menghalang penciptaan penunjuk kepada kelas terbitan. Walau bagaimanapun, penggunaan warisan persendirian, menyekat akses kaedah kelas terbitan dan mengelakkan kaedah kelas asas awam boleh menghalang penggunaannya.
Atas ialah kandungan terperinci Mengapa Anda Perlu Mengelakkan Mewarisi daripada `std::string`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!