Rumah >pembangunan bahagian belakang >C++ >Mengapa Panggilan Fungsi Bukan Maya Berjaya pada Penunjuk NULL Semasa Panggilan Fungsi Maya Gagal?
Mengakses Ahli Kelas pada Penunjuk NULL: Anomali dan Penjelasan
Dalam coretan kod C yang disediakan, diperhatikan bahawa fungsi memanggil ke kaedah bukan maya berjaya walaupun penunjuk objek adalah NULL, manakala panggilan fungsi maya menyebabkan aplikasi ranap. Tingkah laku ingin tahu ini menimbulkan dua soalan asas:
1. Bagaimanakah kaedah bukan maya berfungsi pada penuding NULL?
Tidak seperti panggilan fungsi maya, panggilan fungsi bukan maya tidak memerlukan carian vtable. Pengkompil secara langsung menterjemahkan panggilan fungsi ke dalam arahan kod mesin yang menunjuk kepada fungsi khusus yang akan dilaksanakan. Fungsi menghantar penuding kepada objek yang dipanggil fungsi sebagai parameter tersembunyi.
Dalam kod yang diberikan, fungsi say_hi() tidak membuat sebarang rujukan kepada ahli kelas Foo. Oleh itu, ia boleh dilaksanakan tanpa perlu menyahrujuk penunjuk ini. Pada asasnya, panggilan untuk say_hi() adalah bersamaan dengan:
void Foo_say_hi(Foo* this); Foo_say_hi(foo); // where foo is NULL
Memandangkan fungsi itu tidak pernah cuba untuk mengakses ahli objek, ia tidak menghadapi tingkah laku yang tidak ditentukan iaitu menyahrujuk penuding NULL.
2. Di manakah objek foo diperuntukkan?
Dalam kod yang disediakan, foo diisytiharkan sebagai pembolehubah tempatan jenis Foo*. Oleh kerana ia tidak diberikan peruntukan memori khusus, kemungkinan besar ia diperuntukkan pada timbunan untuk fungsi utama, sama seperti pembolehubah tempatan yang lain. Walau bagaimanapun, nilai yang disimpan dalam foo ialah penuding NULL, menunjukkan bahawa ia tidak menunjuk kepada contoh objek jenis Foo yang sah.
Atas ialah kandungan terperinci Mengapa Panggilan Fungsi Bukan Maya Berjaya pada Penunjuk NULL Semasa Panggilan Fungsi Maya Gagal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!