Dalam C , fungsi maya membenarkan kelas terbitan untuk mengatasi pelaksanaan fungsi yang ditakrifkan dalam kelas asas. Walau bagaimanapun, tingkah laku hujah lalai untuk fungsi maya boleh mengelirukan.
Penerangan Masalah:
Pertimbangkan coretan kod berikut:
class B { public: B(); virtual void print(int data=10) { cout << endl << "B--data=" << data; } }; class D:public B { public: D(); void print(int data=20) { cout << endl << "D--data=" << data; } }; int main() { B *bp = new D(); bp->print(); return 0; }
Output Jangkaan:
[ D--data=20 ]
Output Sebenar:
[ D--data=10 ]
Penjelasan:
Menurut piawaian C (8.3.6.10), apabila memanggil fungsi maya melalui penunjuk atau rujukan, argumen lalai diperoleh daripada jenis statik penuding atau rujukan, bukan fungsi mengatasi kelas terbitan.
Dalam kes ini, bp ialah penunjuk jenis B, jadi hujah lalai B::print (iaitu 10) digunakan, mengatasi argumen lalai D::print (iaitu 20).
Oleh itu, output ialah D--data=10 dan bukannya D--data=20 yang dijangkakan.
Atas ialah kandungan terperinci Mengapakah Argumen Lalai Fungsi Maya Menggunakan Nilai Kelas Asas Daripada Kelas Terbitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!