Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menyelesaikan Isu Menyembunyikan Fungsi Apabila Melebihkan Fungsi dalam Warisan C?

Bagaimanakah Saya Boleh Menyelesaikan Isu Menyembunyikan Fungsi Apabila Melebihkan Fungsi dalam Warisan C?

DDD
Lepaskan: 2025-01-02 17:39:44
asal
497 orang telah melayarinya

How Can I Resolve Function Hiding Issues When Overloading Functions in C   Inheritance?

Melebihi Beban Fungsi dalam Warisan: Memahami Fungsi Tersembunyi

Dalam pengaturcaraan berorientasikan objek, warisan membenarkan kelas mewarisi sifat dan kaedah daripada kelas induk. Walau bagaimanapun, apabila mentakrifkan fungsi dengan nama yang sama tetapi tandatangan berbeza dalam kelas asas dan terbitan, carian nama boleh menjadi samar-samar, membawa kepada ralat.

Masalah:

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: member function not found
    }
};
Salin selepas log masuk

Apabila cuba memanggil foo yang diganti fungsi dalam kelas terbitan C, pengkompil menghadapi ralat kerana carian nama berhenti pada kelas terbitan B dan tidak dapat mencari foo yang diwarisi daripada kelas asas A.

Penyelesaian:

Untuk menyelesaikan isu ini, fungsi dari kelas asas mesti diisytiharkan secara eksplisit dalam skop kelas terbitan menggunakan kata kunci menggunakan. Ini menjadikan kedua-dua fungsi kelihatan dari dalam kelas terbitan.

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

class B : public A
{
public:
    int foo(int i){};
    using A::foo; // Re-declare function from base class
};

class C : public B
{
public:
    void bar()
    {
        string s;
        foo(s); // Now calls the inherited 'foo' function
    }
};
Salin selepas log masuk

Penjelasan:

Pencarian nama dalam warisan adalah hierarki. Secara lalai, carian nama mengutamakan fungsi yang ditakrifkan dalam kelas terbitan. Dalam contoh di atas, apabila foo(s) dipanggil dalam C, pengkompil mula-mula mencari fungsi padanan dalam C, kemudian dalam B, dan akhirnya dalam A. Walau bagaimanapun, memandangkan B mempunyai fungsi foo sendiri, carian berhenti di sana, mengakibatkan ralat.

Dengan mengisytiharkan secara eksplisit fungsi foo kelas asas dalam B menggunakan menggunakan A::foo, pengkompil diarahkan untuk mempertimbangkan kedua-dua fungsi semasa nama carian. Ini membolehkan fungsi foo yang diwarisi ditemui dan digunakan daripada C.

Pada dasarnya, teknik ini menyelesaikan masalah menyembunyikan fungsi dalam kelas terbitan dan memastikan carian nama yang betul apabila bekerja dengan fungsi terlampau beban dalam hierarki warisan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Isu Menyembunyikan Fungsi Apabila Melebihkan Fungsi 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan