Bagaimanakah Argumen Lalai Berkelakuan dalam Fungsi Maya dalam C?

Barbara Streisand
Lepaskan: 2024-11-10 10:12:02
asal
278 orang telah melayarinya

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;
}
Salin selepas log masuk

Apabila anda menjalankan kod ini, anda mungkin menjangkakan outputnya ialah:

D--data=20
Salin selepas log masuk

Walau bagaimanapun, output sebenar ialah:

D--data=10
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan