Penukaran Penunjuk ke Penunjuk dalam Hierarki Warisan
Pertimbangkan kod C berikut:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { Child *c = new Child(); Base *b = c; // Allowed Child **cc = &c; Base **bb = cc; // Error: Conversion not allowed }</code>
Rasional untuk Sekatan Penukaran
Ralat pengkompil dalam baris terakhir menyerlahkan sekatan pada penukaran tersirat daripada Kanak-kanak** ke Pangkalan**. Sekatan ini dikenakan untuk mengekalkan keselamatan jenis.
Jika penukaran ini dibenarkan, ia berpotensi membawa kepada situasi yang tidak dijangka dan salah. Sebagai contoh, seseorang boleh menulis:
<code class="cpp">*bb = new Base;</code>
Ini akan mencipta tika Base dan menyimpan alamatnya dalam bb, dengan berkesan menimpa rujukan Child* asal yang ditunjukkan oleh c. Ini boleh membawa kepada rasuah data dan tingkah laku program yang tidak dapat diramalkan.
Alternatif untuk Penukaran Tersirat
Walaupun tiada cara langsung untuk menghantar Child** secara tersirat ke Base** tanpa bergantung pada gaya C atau reinterpret_cast, terdapat pendekatan alternatif untuk mencapai kefungsian yang diingini sambil mengekalkan keselamatan jenis.
Atas ialah kandungan terperinci Mengapakah Penukaran Tersirat daripada `Anak` kepada `Asas` Dilarang dalam Warisan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!