Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Argumen Lalai Berkelakuan dalam Fungsi Maya dalam C?

Bagaimanakah Argumen Lalai Berkelakuan dalam Fungsi Maya dalam C?

Barbara Streisand
Barbara Streisandasal
2024-11-10 10:12:02319semak imbas

How do Default Arguments Behave in Virtual Functions in C  ?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn