Ralat "Panggilan Fungsi Maya Tulen" Maut: Membongkar Akarnya
Adalah membingungkan untuk menghadapi ranap program dengan "fungsi maya tulen call" ralat, terutamanya apabila kelas yang terjejas adalah abstrak dan oleh itu harus melarang penciptaan objek. Artikel ini bertujuan untuk menjelaskan punca asas di sebalik ralat tersebut dan memberikan penjelasan yang komprehensif.
Panggilan Fungsi Maya dalam Kelas Abstrak
Fungsi maya membenarkan kelas terbitan untuk mengatasi pelaksanaan kelas asas, membolehkan polimorfisme. Walau bagaimanapun, dalam kelas abstrak, fungsi tertentu yang ditetapkan sebagai "fungsi maya tulen" tidak mempunyai sebarang pelaksanaan dalam kelas asas. Sebaliknya, mereka berfungsi sebagai pemegang tempat, yang memerlukan semua kelas terbitan untuk menyediakan pelaksanaan mereka sendiri. Kelas abstrak tanpa sekurang-kurangnya satu fungsi maya tulen boleh digunakan, tetapi panggilan ke fungsi maya tulen akan menyebabkan ralat masa jalan.
Ranap "Panggilan Fungsi Maya Tulen"
Walau bagaimanapun, senario yang tidak dijangka boleh berlaku apabila panggilan fungsi maya dicuba dari dalam pembina atau pemusnah. Disebabkan oleh kekangan pembinaan dan pemusnahan objek, panggilan fungsi maya tidak dibenarkan pada peringkat ini. Akibatnya, versi kelas asas bagi fungsi maya digunakan sebaliknya, yang dalam kes fungsi maya tulen, tidak wujud, mencetuskan ranap masa jalan.
Ilustrasi Contoh
Pertimbangkan coretan kod berikut:
class Base { public: Base() { reallyDoIt(); } void reallyDoIt() { doIt(); } // DON'T DO THIS virtual void doIt() = 0; }; class Derived : public Base { void doIt() {} }; int main(void) { Derived d; // This will cause "pure virtual function call" error }
Dalam contoh ini, percubaan untuk menggunakan fungsi maya (doIt()) daripada pembina kelas asas abstrak (Base) menghasilkan "maya tulen ralat panggilan fungsi" apabila objek kelas terbitan (d) dicipta. Memandangkan tiada pelaksanaan untuk doIt() dalam Base, panggilan jatuh ke pemegang tempat fungsi maya tulen, yang tidak sah.
Kesimpulan
"Fungsi maya tulen panggilan" ralat berlaku apabila panggilan fungsi maya tersilap dibuat daripada pembina atau pemusnah. Memahami had ini adalah penting untuk mengelakkan ranap sistem ini dan memastikan kelas abstrak berfungsi dengan betul. Untuk mendapatkan maklumat lanjut, rujuk artikel Raymond Chen yang mencerahkan tentang subjek tersebut.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Panggilan Fungsi Maya Tulen' dalam Pembina dan Pemusnah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!