Invokasi Pembina Fungsi Maya
Dalam C , pembina bertanggungjawab untuk memulakan objek. Walau bagaimanapun, apabila berurusan dengan kelas terbitan dan fungsi maya, tingkah laku tertentu boleh timbul yang mungkin tidak intuitif serta-merta.
Pertimbangkan contoh berikut:
#include <iostream> struct base { virtual const int value() const { return 0; } base() { std::cout << value() << std::endl; } virtual ~base() {} }; struct derived : public base { virtual const int value() const { return 1; } }; int main(void) { derived example; }
Dalam contoh ini, kami mempunyai asas pangkalan kelas dengan nilai fungsi maya(). Kelas terbitan yang diperolehi diwarisi daripada asas dan mengatasi nilai(). Pembina dalam asas cuba memanggil value() dalam pembinanya.
Apabila pembina terbitan dipanggil, pembina asas dipanggil dahulu. Pada ketika ini, objek masih dalam keadaan kelas asas, dan value() menyelesaikan kepada pelaksanaan kelas asas. Inilah sebabnya mengapa program mencetak "0" dan bukannya "1" yang dijangkakan.
Untuk menangani isu ini, kita perlu memastikan bahawa objek dimulakan sepenuhnya sebagai kelas terbitan sebelum memanggil value() dalam pembina . Satu cara untuk mencapainya ialah dengan melambatkan panggilan ke value() sehingga selepas pembina terbitan dilaksanakan, yang boleh dilakukan dengan menggunakan fungsi maya dalam pembina kelas terbitan.
Atas ialah kandungan terperinci Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Mencetak Nilai Kelas Asas, Bukan Nilai Kelas Terbitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!