Rumah > pembangunan bahagian belakang > C++ > Mengapa 'Berfungsi dengan Nama Yang Sama tetapi Tandatangan Berbeza dalam Kelas Terbitan Tidak Ditemui' Berlaku dalam Warisan C?

Mengapa 'Berfungsi dengan Nama Yang Sama tetapi Tandatangan Berbeza dalam Kelas Terbitan Tidak Ditemui' Berlaku dalam Warisan C?

Mary-Kate Olsen
Lepaskan: 2024-12-21 03:40:09
asal
740 orang telah melayarinya

Why Does

Fungsi Menyembunyikan dalam Hierarki Kelas: Memahami "Fungsi dengan Nama Sama tetapi Tandatangan Berbeza dalam Kelas Terbitan Tidak Ditemui" Ralat

Dalam pengaturcaraan berorientasikan objek, kelas terbitan boleh mewarisi ahli daripada kelas asas mereka. Walau bagaimanapun, isu mungkin timbul apabila fungsi dengan nama yang sama tetapi tandatangan yang berbeza wujud dalam kedua-dua kelas asas dan terbitan. Ini boleh membawa kepada ralat seperti "Fungsi dengan nama yang sama tetapi tandatangan berbeza dalam kelas terbitan tidak ditemui."

Untuk menggambarkan masalah ini, pertimbangkan coretan kod berikut:

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Error: no matching function
    }
};
Salin selepas log masuk

Apabila menyusun kod ini, pengkompil menghadapi ralat dalam panggilan foo(s) dalam fungsi bar() kelas C. Walaupun fungsi foo(string s) sedang hadir dalam kelas asas A, pengkompil gagal mengenalinya disebabkan fenomena yang dikenali sebagai fungsi menyembunyikan.

Dalam senario ini, fungsi foo(int i) yang ditakrifkan dalam kelas B menyembunyikan fungsi foo(rentetan s) yang diwarisi daripada kelas A. Ini kerana carian nama dalam hierarki kelas berhenti pada pengisytiharan pertama nama yang sepadan. Oleh itu, apabila proses carian mencapai kelas B, ia menemui fungsi foo(int i) dan mengabaikan fungsi foo(rentetan s) yang ditindih dalam kelas asas.

Untuk menyelesaikan isu ini, seseorang mesti mengisytiharkan semula secara eksplisit fungsi kelas asas dalam skop kelas terbitan. Dengan menggunakan kata kunci menggunakan untuk mewarisi fungsi kelas asas, kedua-dua fungsi menjadi kelihatan dalam kelas terbitan dan subkelasnya:

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
    using A::foo; // Redeclare base class foo function
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Now finds the base class foo(string s)
    }
};
Salin selepas log masuk

Dengan memasukkan baris ini dalam kelas B, carian nama akan mempertimbangkan dengan betul kedua-dua foo( int i) dan foo(rentetan s), menyelesaikan isu penyembunyian fungsi.

Atas ialah kandungan terperinci Mengapa 'Berfungsi dengan Nama Yang Sama tetapi Tandatangan Berbeza dalam Kelas Terbitan Tidak Ditemui' Berlaku dalam Warisan 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