Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Tidak Boleh Menukar Penunjuk-ke-Penunjuk Kelas Terbitan kepada Penunjuk-ke-Penunjuk Kelas Asas?

Mengapa Anda Tidak Boleh Menukar Penunjuk-ke-Penunjuk Kelas Terbitan kepada Penunjuk-ke-Penunjuk Kelas Asas?

Barbara Streisand
Barbara Streisandasal
2024-10-29 10:49:02875semak imbas

Why Can't You Implicitly Convert a Pointer-to-Pointer of a Derived Class to a Pointer-to-Pointer of a Base Class?

Penukaran Tersirat Penunjuk ke Penunjuk antara Kelas Terbitan dan Asas

Apabila berurusan dengan penukaran penuding ke penuding antara terbitan dan asas kelas, ralat biasa yang dihadapi ialah ketidakupayaan untuk menukar secara tersirat penuding ke penuding kelas terbitan (Kanak) kepada penuding ke penuding kelas asas (Asas). Ini kerana penukaran sedemikian boleh membawa kepada situasi yang tidak dijangka dan berpotensi berbahaya.

Pertimbangkan contoh program yang disediakan:

<code class="cpp">class Base { };

class Child : public Base { };

int main()
{   
    Child *c = new Child();
    Base *b = c;

    Child **cc = &amp;c;
    Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’
}</code>

Ralat timbul kerana pengkompil menghalang penetapan cc (a Child ) kepada bb (sebuah Pangkalan). Sebab asas larangan ini adalah untuk melindungi daripada kemungkinan ketidakkonsistenan dalam objek yang ditunjukkan oleh bb. Jika penukaran sedemikian dibenarkan, ia boleh membawa kepada senario di mana bb menunjuk kepada contoh Base yang bukan berasal daripada Child.

Untuk menangani isu ini, terdapat dua pendekatan:

  1. Gunakan hantaran eksplisit: Gunakan hantaran gaya C atau reinterpret_cast untuk melakukan penukaran secara manual. Walau bagaimanapun, pendekatan ini kehilangan keselamatan jenis.
  2. Ubah suai takrif kelas: Ubah suai takrifan kelas untuk memperkenalkan penunjuk maya atau warisan berbilang untuk mewujudkan hubungan yang sah antara kelas terbitan dan asas, membenarkan untuk selamat penukaran tersirat.

Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menukar Penunjuk-ke-Penunjuk Kelas Terbitan kepada Penunjuk-ke-Penunjuk Kelas Asas?. 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