Mengatasi Fungsi Maya dalam Pembina
Pertimbangkan coretan kod berikut:
#include <iostream> struct base { virtual const int value() const { return 0; } base() { // Default constructor std::cout << value() << std::endl; } }; struct derived : public base { virtual const int value() const { return 1; } }; int main() { derived d; // Declares an instance of the derived class }
Apabila kami menjalankan kod ini, ia mencetak 0 dan bukannya 1 yang dijangkakan. Mengapa?
Panggilan Fungsi Maya Semasa Pembinaan
Apabila pembina kelas asas memanggil fungsi maya dalam pembina, fungsi maya dipanggil pada contoh kelas asas dan bukannya contoh kelas terbitan. Ini adalah hasil daripada proses 'kematangan' objek semasa pembinaan.
Dalam contoh kami, pembina asas memanggil value() apabila objek sebahagiannya dibina. Pada ketika ini, objek itu belum lagi "matang" menjadi objek terbitan. Oleh itu, pelaksanaan asas nilai() dipanggil.
Cara Menyelesaikan Isu
Untuk membuat cetakan kod 1, anda boleh mengelak daripada memanggil fungsi maya dalam pembina. Ini boleh dicapai dengan:
Menggunakan Penunjuk: Panggil fungsi maya dari penunjuk atau rujukan kepada kelas asas dan bukannya terus dari fungsi ahlinya:
base* b = new derived(); b->value(); // Calls the derived class implementation delete b;
Menggunakan Senarai Permulaan Ahli: Gunakan ahli senarai permulaan untuk menyatakan secara eksplisit nilai fungsi maya dalam pembina:
derived d : base() { } // Initializes `base()` and the virtual function // call to occur within the constructor
Atas ialah kandungan terperinci Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Menghasilkan Pelaksanaan Kelas Asas Digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!