Gotcha dalam C : Mengakses Ahli Kelas Bukan Maya pada Penunjuk Null
Dalam C , memanggil fungsi ahli bukan maya pada null penunjuk mungkin berfungsi secara tidak dijangka, menimbulkan teka-teki yang ingin tahu. Mari kita mendalami tingkah laku ini melalui coretan kod yang menarik:
class Foo { public: virtual void say_virtual_hi() { std::cout << "Virtual Hi"; } void say_hi() { std::cout << "Hi"; } }; int main() { Foo* foo = 0; foo->say_hi(); // Works well foo->say_virtual_hi(); // Crashes the app return 0; }
Teka-teki Diterangkan
Kekeliruan timbul daripada mekanisme berbeza yang digunakan untuk memanggil kaedah maya dan bukan maya .
Dalam kod yang diberikan, kaedah bukan maya say_hi() tidak sekali-kali menafikan penunjuk ini secara eksplisit, memintas ralat penyahrujukan penunjuk nol. Ia pada asasnya adalah setara dengan panggilan fungsi dengan parameter yang diluluskan oleh nilai:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
Gelagat Tidak Ditakrifkan
Secara teknikal, memanggil sebarang fungsi (walaupun bukan maya) pada penunjuk nol ialah tingkah laku yang tidak ditentukan dalam C . Walau bagaimanapun, sesetengah pelaksanaan pengkompil mungkin menyediakan gelagat yang jelas untuk senario tertentu, seperti panggilan fungsi bukan maya di atas.
Awas
Walaupun tingkah laku yang tidak dijangka mungkin kelihatan mudah, bergantung padanya adalah berisiko dan bukan amalan terbaik. Sentiasa elakkan mengakses ahli kelas pada penunjuk nol, kerana ia boleh membawa kepada keputusan yang tidak dijangka dan tidak dapat diramalkan.
Atas ialah kandungan terperinci Mengapa Memanggil Ahli Bukan Maya Berfungsi pada Penunjuk Null dalam C Kadang-kadang Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!