Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Pelbagai Fungsi Diwarisi dengan Nama Yang Sama tetapi Tandatangan Berbeza Menyelesaikan dalam C?

Bagaimanakah Pelbagai Fungsi Diwarisi dengan Nama Yang Sama tetapi Tandatangan Berbeza Menyelesaikan dalam C?

Susan Sarandon
Lepaskan: 2024-12-14 00:04:14
asal
550 orang telah melayarinya

How Do Multiple Inherited Functions with Identical Names but Different Signatures Resolve in C  ?

Berbilang Fungsi Diwarisi dengan Tandatangan Sama Tidak Terlebih Beban

Dalam pengaturcaraan berorientasikan objek, warisan membenarkan kelas mewarisi sifat dan kaedah daripada kelas induk. Walau bagaimanapun, isu biasa timbul apabila berbilang kelas yang diwarisi mempunyai fungsi dengan nama yang sama tetapi tandatangan berbeza.

Masalah

Pertimbangkan coretan kod berikut:

#include <iostream>

struct Base1 {
    void foo(int);
};

struct Base2 {
    void foo(float);
};

struct Derived : public Base1, public Base2 {
};

int main() {
    Derived d;
    d.foo(5); // Ambiguous call to "foo"

    std::cin.get();
    return 0;
}
Salin selepas log masuk

Kod ini menghasilkan ralat "ambiguous call to foo", yang menunjukkan bahawa panggilan to foo tidak boleh diselesaikan kerana terdapat berbilang fungsi yang diwarisi dengan nama yang sama tetapi tandatangan yang berbeza.

Penjelasan

Mengikut peraturan carian ahli C, apabila kelas mewarisi daripada berbilang asas kelas dan terdapat berbilang pengisytiharan untuk nama yang sama, sebarang pengisytiharan tersembunyi akan dihapuskan. Jika set pengisytiharan yang terhasil adalah daripada jenis yang berbeza atau termasuk ahli bukan statik daripada kelas asas yang berbeza, kekaburan berlaku.

Dalam contoh di atas, kedua-dua Base1 dan Base2 mentakrifkan fungsi foo, tetapi mereka mempunyai tandatangan yang berbeza. Apabila Terbitan mewarisi daripada Base1 dan Base2, terdapat dua pengisytiharan berbeza untuk foo dengan jenis yang berbeza. Ini mengakibatkan kekaburan, menyebabkan ralat kompilasi.

Penyelesaian

Untuk menyelesaikan kekaburan, anda boleh menggunakan menggunakan pengisytiharan untuk menentukan versi kelas asas foo yang hendak digunakan. Contohnya:

class Derived : public Base1, public Base2 {
    using Base1::foo;
};
Salin selepas log masuk

Ini menggunakan pengisytiharan memastikan bahawa fungsi foo daripada Base1 digunakan dalam Derived.

Gotcha

Perhatikan bahawa dalam coretan kod kedua yang anda berikan, kelas Terbitan hanya mempunyai satu fungsi foo (dengan parameter apungan). Ini kerana fungsi foo daripada Base1 disembunyikan oleh fungsi foo daripada Derived. Oleh itu, d.foo(5) memanggil fungsi foo dengan parameter apungan daripada Derived, bukan Base1.

Jadi, untuk menjawab soalan dalam tajuk, berbilang fungsi yang diwarisi dengan nama yang sama tetapi tandatangan berbeza tidak dianggap sebagai fungsi terlebih beban kerana ia akan mengakibatkan kekaburan. Sebaliknya, pengkompil memerlukan resolusi eksplisit menggunakan pengisytiharan atau teknik lain untuk menentukan fungsi yang harus digunakan.

Atas ialah kandungan terperinci Bagaimanakah Pelbagai Fungsi Diwarisi dengan Nama Yang Sama tetapi Tandatangan Berbeza Menyelesaikan 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