Gelagat Argumen Lalai Fungsi Maya
Dalam C , fungsi maya menyediakan mekanisme untuk polimorfisme. Walau bagaimanapun, kelakuan argumen lalai dalam fungsi maya boleh mengelirukan.
Pertimbangkan 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; }
Apabila anda menjalankan kod ini, anda mungkin menjangkakan outputnya ialah:
D--data=20
Walau bagaimanapun, output sebenar ialah:
D--data=10
Penjelasan:
Sebab bagi tingkah laku yang tidak dijangka ini terletak pada piawaian C (8.3 .6.10), yang menyatakan bahawa panggilan fungsi maya menggunakan argumen lalai dalam pengisytiharan fungsi maya yang ditentukan oleh jenis statik penuding atau rujukan yang menandakan objek. Dalam kes ini, kerana anda memanggil print() melalui penunjuk jenis B (iaitu, bp), argumen lalai B::print() digunakan, walaupun fungsi yang diganti dalam kelas terbitan D mempunyai lalai yang berbeza argumen.
Oleh itu, apabila memanggil fungsi maya melalui penuding atau rujukan kelas asas, argumen lalai bagi fungsi kelas asas, bukan fungsi yang diganti, digunakan. Tingkah laku ini penting untuk difahami bagi mengelakkan sebarang kekeliruan atau hasil yang tidak dijangka apabila bekerja dengan fungsi maya dan hujah lalai.
Atas ialah kandungan terperinci Bagaimanakah Argumen Lalai Berkelakuan dalam Fungsi Maya dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!