Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Nyahkekaburan Ahli Kelas dalam Berbilang Warisan dengan Set Jenis Tidak Bertindih?

Bagaimana untuk Nyahkekaburan Ahli Kelas dalam Berbilang Warisan dengan Set Jenis Tidak Bertindih?

Barbara Streisand
Barbara Streisandasal
2024-10-25 01:11:02235semak imbas

How to Disambiguate Class Members in Multiple Inheritance with Non-Overlapping Sets of Types?

Nyahkekaburan Ahli Kelas dalam Berbilang Warisan dengan Set Jenis Tidak Bertindih

Cabaran timbul apabila mewarisi daripada pelbagai pangkalan dengan set tidak bertindih daripada jenis. Apabila memanggil fungsi ahli, pengkompil menjangkakan untuk mengenal pasti kelas asas tertentu untuk digunakan, tetapi dalam kes sedemikian, ia menghadapi kekaburan.

Semasa templat Contains menentukan sama ada jenis wujud dalam pek variadic, peraturan gabungan untuk carian ahli kelas dalam kes di mana set pengisytiharan kelas yang diperolehi kosong boleh mengakibatkan kekaburan. Memandangkan kedua-dua kelas asas tidak mempunyai ahli dalam set pengisytiharan kelas terbitan, proses cantuman menggabungkan set carian daripada setiap pangkalan, membawa kepada panggilan samar-samar.

Penyelesaian Kemungkinan

  • Pengisytiharan Menggunakan Eksplisit: Dengan menambahkan pengisytiharan penggunaan eksplisit untuk setiap fungsi ahli kelas asas, kelas terbitan mentakrifkan ahli tersebut dengan berkesan, menjadikan set pengisytiharannya tidak kosong dan memintas peraturan cantum yang tidak jelas.

    <code class="cpp">struct Derived : public Base<int, char>, public Base<double, void>
    {
      using Base<int, char>::foo;
      using Base<double, void>::foo;
    };</code>
  • Base Collector: Menggunakan teknik metaprogramming templat, laksanakan kelas BaseCollector yang mengumpul ahli semua kelas asas dan mengisytiharkannya menggunakan dalam kelas terbitan . Pendekatan ini menyediakan penyelesaian generik tanpa memerlukan pengisytiharan penggunaan eksplisit.

    <code class="cpp">struct Derived : BaseCollector<Base2<int>, Base2<std::string>>
    { };</code>
  • Peluasan Pek Variadik Menggunakan Pengisytiharan (C 17): Penggunaan pengembangan pek variadic boleh memudahkan pelaksanaan BaseCollector, menjadikannya lebih pendek dan lebih cekap.

    <code class="cpp">template <typename... Bases>
    struct BaseCollector : Bases...
    {
      using Bases::foo...;
    };</code>

    Dengan menggunakan teknik ini, kami boleh menyahkekaburan panggilan ahli kelas dalam berbilang senario warisan dengan set jenis yang tidak bertindih, membolehkan untuk jelas dan jelas. pelaksanaan kod.

Atas ialah kandungan terperinci Bagaimana untuk Nyahkekaburan Ahli Kelas dalam Berbilang Warisan dengan Set Jenis Tidak Bertindih?. 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