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
DDDasal
2024-12-08 08:00:221009semak imbas

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 {};

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
}

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;
};

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!

Kenyataan:
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