Rumah >pembangunan bahagian belakang >C++ >Mengapakah Penukaran Tersirat daripada `Anak` kepada `Asas` Dilarang dalam Warisan C?

Mengapakah Penukaran Tersirat daripada `Anak` kepada `Asas` Dilarang dalam Warisan C?

DDD
DDDasal
2024-10-28 16:10:28435semak imbas

 Why is Implicit Conversion from `Child` to `Base` Forbidden in C   Inheritance?

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.

  • Warisan Maya: Dengan warisan maya, kelas mewarisi daripada berbilang induk kelas melalui satu salinan objek kelas asas. Ini boleh digunakan untuk mencapai gelagat polimorfik tanpa isu penukaran yang disebutkan di atas.
  • Kelas Jambatan: Seseorang boleh mentakrifkan kelas perantaraan yang mewarisi secara terbuka daripada Base dan Child dan berfungsi sebagai jambatan antara dua. Ini membolehkan tuangan yang jelas dan terkawal antara jenis penunjuk yang berbeza 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!

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