Penukaran Penunjuk Berganda Kelas Terbitan kepada Penunjuk Berganda Kelas Asas: Tanpa Nama dan Keselamatan
Dalam C , penunjuk kepada kelas terbitan boleh ditukar secara tersirat kepada penunjuk kepada kelas asas mereka, yang merupakan ciri mudah untuk pengaturcaraan berasaskan warisan. Walau bagaimanapun, apabila merujuk kepada petunjuk berganda, penukaran tersirat ini menimbulkan beberapa kebimbangan keselamatan.
Pertimbangkan kod berikut:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { // Convert child to base (no problem) Child *c = new Child(); Base *b = c; // Convert double pointer to child to double pointer to base (error) Child **cc = &c; Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’ }</code>
GCC berhak mengadu tentang pernyataan tugasan terakhir kerana penukaran langsung daripada Kanak-kanak** ke Pangkalan** tidak dibenarkan secara tersirat. Ini disebabkan oleh perbezaan asas dalam sifat penunjuk ini:
Membenarkan Kanak-kanak** menukar secara tersirat kepada Pangkalan** akan melanggar perbezaan ini dan memperkenalkan potensi bahaya keselamatan:
<code class="cpp">// After explicit cast *bb = new Base; // Child pointer now points to a Base!</code>
Ini boleh menyebabkan penghirisan objek, yang mana data khusus Kanak-kanak akan hilang dan integriti terjejas. Untuk mengekalkan keselamatan jenis, penukaran antara Kanak-kanak** dan Pangkalan** adalah dilarang secara jelas.
Pilihan Casting Alternatif
Walaupun penghantaran tersirat tidak disokong, terdapat alternatif kaedah pemutus yang membenarkan penukaran antara penuding berganda kelas terbitan dan kelas asas:
Ringkasnya, kekurangan penukaran tersirat antara penunjuk berganda kelas terbitan dan penunjuk berganda kelas asas melindungi daripada kemungkinan isu keselamatan jenis. Apabila perlu, gunakan kaedah pemutus alternatif dengan berhati-hati dan pertimbangkan untuk mengubah suai definisi kelas untuk pemutus dinamik dengan pemusnah maya.
Atas ialah kandungan terperinci Bolehkah Penunjuk Berganda Kelas Terbitan Ditukarkan Secara Tersirat kepada Penunjuk Berganda Kelas Asas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!