Rumah >pembangunan bahagian belakang >C++ >Mengapakah Panggilan Kaedah Bukan Maya pada Penunjuk NULL Berjaya Semasa Panggilan Kaedah Maya Gagal dalam C ?

Mengapakah Panggilan Kaedah Bukan Maya pada Penunjuk NULL Berjaya Semasa Panggilan Kaedah Maya Gagal dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-12-13 10:03:10473semak imbas

Why Do Non-Virtual Method Calls on NULL Pointers Succeed While Virtual Method Calls Fail in C  ?

Mengakses Ahli Kelas pada Penunjuk NULL: Meneroka Gelagat Kaedah Bukan Maya

Soalan:

Mengapakah panggilan kaedah bukan maya berjaya pada penunjuk NULL dalam C , manakala panggilan kaedah maya merosakkan atur cara?

Jawapan:

Gelagat Kaedah Bukan Maya:

Apabila bukan- kaedah maya dipanggil pada penunjuk NULL, pengkompil menjana kod yang secara langsung memanggil pelaksanaan kaedah. Ini dicapai dengan menghantar parameter "ini" tersembunyi ke fungsi, yang dalam kes penunjuk NULL, tidak menunjuk ke mana-mana. Walau bagaimanapun, kaedah itu sendiri tidak cuba untuk mengakses mana-mana ahli objek, jadi kod itu mengelak daripada menyahrujuk penuding NULL dan beroperasi seperti yang dimaksudkan.

Definisi Formal:

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa menggunakan sebarang kaedah pada penunjuk NULL secara rasmi dianggap sebagai tingkah laku tidak ditentukan dalam C . Ini bermakna pengkompil boleh membuat pilihan sewenang-wenangnya tentang perkara yang berlaku, termasuk membenarkan atur cara berjalan nampaknya dengan betul.

Gelagat Kaedah Maya:

Panggilan kaedah maya memerlukan vtable carian untuk menentukan pelaksanaan yang hendak digunakan. Vtable dikaitkan dengan objek sebenar, jadi memanggil kaedah maya pada penunjuk NULL, yang tidak mempunyai vtable berkaitan, mengakibatkan ranap sistem.

Peruntukan Objek:

Pembolehubah "foo" dalam kod yang disediakan ialah pembolehubah tempatan yang diperuntukkan pada timbunan fungsi utama. Walau bagaimanapun, ia dimulakan dengan penuding NULL, menunjukkan bahawa ia tidak menghala ke mana-mana objek jenis Foo yang sah.

Atas ialah kandungan terperinci Mengapakah Panggilan Kaedah Bukan Maya pada Penunjuk NULL Berjaya Semasa Panggilan Kaedah Maya Gagal dalam 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