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
Lepaskan: 2024-10-28 16:10:28
asal
396 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan