Rumah > pembangunan bahagian belakang > C++ > Mengapa Berbilang Warisan Tidak Menyokong Fungsi Terlalu Beban dengan Nama Yang Sama tetapi Tandatangan Berbeza?

Mengapa Berbilang Warisan Tidak Menyokong Fungsi Terlalu Beban dengan Nama Yang Sama tetapi Tandatangan Berbeza?

DDD
Lepaskan: 2024-12-08 08:00:22
asal
1006 orang telah melayarinya

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

Fungsi Terlebih Beban dengan Berbilang Warisan

Dalam C , lebihan fungsi membenarkan berbilang fungsi dengan nama yang sama ditakrifkan dalam satu skop, dengan syarat mereka mempunyai senarai parameter yang berbeza. Walau bagaimanapun, tingkah laku ini tidak meliputi fungsi berbilang diwarisi dengan nama yang sama tetapi tandatangan berbeza. Ini menimbulkan persoalan: mengapa fungsi sedemikian tidak dianggap sebagai terbeban?

Menurut Seksyen 10.2/2 Piawaian C, peraturan carian ahli menentukan bahawa pengisytiharan tersembunyi dihapuskan daripada pertimbangan semasa carian nama. Apabila berbilang kelas asas mentakrifkan fungsi dengan nama yang sama tetapi parameter berbeza, fungsi ini mungkin disembunyikan antara satu sama lain. Oleh itu, jika set pengisytiharan yang terhasil bukan daripada sub-objek jenis yang sama, atau termasuk ahli bukan statik dan ahli daripada sub-objek yang berbeza, kesamaran timbul dan program itu dianggap tidak berbentuk.

Contohnya:

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};
Salin selepas log masuk

Dalam kes ini, f adalah samar-samar kerana ia ditakrifkan dalam dua kelas asas yang berbeza (A dan B). Oleh itu, panggilan berikut kepada f daripada kelas C adalah tidak betul:

int main() {
  C c;
  c.f();  // ambiguous
}
Salin selepas log masuk

Untuk menyelesaikan kekaburan ini, anda boleh menggunakan perisytiharan menggunakan untuk menentukan kelas asas yang melaksanakan fungsi f. Contohnya:

class C : public A, public B {
     using A::f;
     using B::f;
};
Salin selepas log masuk

Dengan pengubahsuaian ini, c.f() kini secara eksplisit memanggil f dari kelas A, menyelesaikan kekaburan.

Sebaliknya, contoh kod kedua yang anda berikan berfungsi kerana foo( float) ditakrifkan dalam skop kelas Terbitan, dan tidak diwarisi daripada berbilang kelas asas. Oleh itu, d.foo(5) memanggil fungsi foo(float) secara langsung, tanpa sebarang kesamaran.

Atas ialah kandungan terperinci Mengapa Berbilang Warisan Tidak Menyokong Fungsi Terlalu Beban dengan Nama Yang Sama tetapi Tandatangan Berbeza?. 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