Rumah >pembangunan bahagian belakang >C++ >Mengapakah Invokasi Kaedah Eksplisit Diperlukan untuk Kaedah Terlebih Beban dalam Kelas Terbitan?

Mengapakah Invokasi Kaedah Eksplisit Diperlukan untuk Kaedah Terlebih Beban dalam Kelas Terbitan?

DDD
DDDasal
2024-11-02 12:50:021058semak imbas

Why is Explicit Method Invocation Required for Overloaded Methods in Derived Classes?

C Resolution Overload: Pemilihan Kaedah Eksplisit Diperlukan

Dalam C , resolusi lebihan berlaku berdasarkan jenis hujah dan skop di mana kaedah diisytiharkan. Untuk memastikan pemilihan kaedah yang tepat, senario tertentu memerlukan penggunaan kaedah yang jelas.

Pertimbangkan contoh berikut:

<code class="cpp">class A {
  public:
    int DoSomething() { return 0; }
};

class B : public A {
  public:
    int DoSomething(int x) { return 1; }
};

int main() {
  B* b = new B();
  b->A::DoSomething(); // Why this?
  // b->DoSomething(); // Why not this? (Compiler error)
  delete b;
  return 0;
}</code>

Mengapa pernyataan b->A::DoSomething(); perlu?

Memahami Resolusi Lebihan Beban:

Dalam kes ini, pengkompil mempertimbangkan skop kaedah semasa melaksanakan resolusi beban lampau. Secara lalai, ia hanya mencari dalam skop kelas semasa untuk padanan kaedah. Dalam kelas B, pengkompil mencari DoSomething(int) dalam skop semasa, yang menerima argumen int tunggal.

Invokasi Eksplisit Diperlukan:

Walau bagaimanapun, kelas induk A juga mengisytiharkan versi DoSomething() yang tidak memerlukan hujah. Untuk mengakses kaedah ini dalam kelas B terbitan, ia mesti digunakan secara eksplisit menggunakan operator skop kelas (A::).

Pernyataan b->DoSomething(); akan gagal untuk menyusun kerana pengkompil tidak dapat mencari kaedah bernama DoSomething() tanpa argumen dalam skop kelas B. Ia salah mengandaikan bahawa DoSomething(int) ialah kaedah yang dimaksudkan.

Penyelesaian:

Untuk menangani isu ini, satu penyelesaian adalah dengan memperkenalkan perisytiharan penggunaan dalam kelas B. Ini menarik kaedah DoSomething() daripada kelas induk ke dalam skop kelas terbitan:

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // …
};</code>

Dengan pengubahsuaian ini, resolusi beban lampau kini boleh mengenal pasti kaedah DoSomething() yang dikehendaki dengan betul, menghapuskan keperluan untuk seruan eksplisit menggunakan b->A::DoSomething();.

Atas ialah kandungan terperinci Mengapakah Invokasi Kaedah Eksplisit Diperlukan untuk Kaedah Terlebih Beban dalam Kelas Terbitan?. 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