Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi Maya Berkelakuan Tidak Dijangka Semasa Permulaan Objek C?

Mengapa Fungsi Maya Berkelakuan Tidak Dijangka Semasa Permulaan Objek C?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 13:22:16748semak imbas

Why Do Virtual Functions Behave Unexpectedly During C   Object Initialization?

Memahami Warisan dan Permulaan Objek dalam C untuk Akses Fungsi Maya

Dalam C , warisan membolehkan penciptaan kelas terbitan yang mewarisi sifat dan tingkah laku daripada kelas asas. Walau bagaimanapun, susunan permulaan objek dalam C boleh memberi kesan bagaimana fungsi maya berkelakuan.

Soalan:

Apabila objek dibina dalam C dengan kelas asas yang mempunyai maya fungsi, mengapa fungsi itu berkelakuan tanpa diduga?

Jawapan:

Konsep utama di sini ialah susunan permulaan untuk kelas asas dan terbitan. Dalam C , kelas asas dibina sebelum kelas terbitan.

Penjelasan:

Dalam contoh yang disediakan:

  • Kelas asas mentakrifkan nilai fungsi maya() yang mengembalikan 0 secara lalai.
  • diperolehi warisan daripada asas dan mengatasi fungsi value() untuk mengembalikan 1.
  • Apabila terbitan dibuat instantiat, ia mula-mula membina bahagian asas objek.
  • Walau bagaimanapun, pada ketika ini, objek itu belum lengkap contoh terbitan, kerana pembina kelas terbitan belum dilaksanakan lagi.
  • Oleh itu, apabila pangkalan pembina memanggil value(), ia menggunakan versi asas fungsi dan bukannya versi terbitan yang diganti, menghasilkan output 0.

Untuk membetulkan tingkah laku ini:

Untuk memastikan bahawa fungsi nilai() kelas terbitan dipanggil semasa pembinaan objek, anda harus memulakan kelas asas secara eksplisit dengan alamat contoh kelas terbitan:

derived example;
base(&example).value()

Dengan menghantar alamat objek terbitan, anda mengarahkan pembina asas untuk memanggil fungsi value() pada objek terbitan, dengan berkesan "mematangkan" objek ke dalam bentuk terbitan lengkapnya .

Atas ialah kandungan terperinci Mengapa Fungsi Maya Berkelakuan Tidak Dijangka Semasa Permulaan Objek 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