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

Susan Sarandon
Lepaskan: 2024-10-25 06:03:02
asal
591 orang telah melayarinya

## How to Disambiguate Class Member Calls in Multiple Inheritance with Overlapping Type Sets?

Nyahkekaburan Ahli Kelas dalam Berbilang Warisan dengan Set Bertindih

Dalam C , berbilang warisan dengan set jenis yang bertindih boleh menyebabkan kekaburan semasa membuat panggilan fungsi ahli dengan parameter templat. Untuk memahami sebabnya, mari kita periksa templat kelas asas:

<code class="cpp">template <typename ... Types>
class Base {
public:
    template <typename T>
    typename std::enable_if<Contains<T, Types ...>::value>::type
    foo() {
        std::cout << "Base::foo()\n";
    }
};
Salin selepas log masuk

Ahli foo() hanya boleh dipanggil apabila parameter templat yang ditentukan terdapat dalam senarai parameter templat Base. Sekarang, katakan kita mentakrifkan kelas terbitan Terbitan yang mewarisi daripada berbilang contoh Base dengan set jenis tidak bertindih:

<code class="cpp">struct Derived: public Base<int, char>,
                public Base<double, void>
{};</code>
Salin selepas log masuk

Apabila memanggil Derived().foo(), pengkompil mungkin tidak dapat menentukan kelas asas yang hendak digunakan kerana parameter templat int terdapat dalam kedua-dua kelas asas. Kekaburan ini akan membawa kepada ralat pengkompil.

Penyelesaian Kemungkinan

  1. Spesifikasi Asas Eksplisit: Kekaburan boleh diselesaikan dengan menyatakan secara eksplisit kelas asas untuk digunakan, cth., Derived().Base::foo(). Walau bagaimanapun, penyelesaian ini memerlukan pemanggil mengetahui kelas asas tertentu, yang boleh menjadi tidak diingini.
  2. Menggunakan Pengisytiharan: Dalam C , menggunakan pengisytiharan boleh membawa ahli kelas asas ke dalam ruang nama kelas terbitan. Dengan menambah menggunakan Base::foo; dan menggunakan Base::foo; kepada perisytiharan kelas terbitan, kekaburan itu boleh dinyahkekaburan. Walau bagaimanapun, penyelesaian ini memerlukan pengguna kelas terbitan untuk memasukkan ini menggunakan pengisytiharan, yang boleh menyusahkan dan berulang untuk senarai jenis besar.
  3. Templat Kelas Pengumpul Asas: Penyelesaian yang lebih elegan ialah untuk menggunakan templat kelas pengumpul yang menggabungkan pengisytiharan semua kelas asas dan mendedahkan ahli melalui penggunaan pengisytiharan. Contohnya:
<code class="cpp">template <typename... Bases>
struct BaseCollector;

template <typename Base>
struct BaseCollector<Base> : Base
{
    using Base::foo;
};

template <typename Base, typename... Bases>
struct BaseCollector<Base, Bases...>:
    Base,
    BaseCollector<Bases...>
{
    using Base::foo;
    using BaseCollector<Bases...>::foo;
};

struct Derived: public BaseCollector<Base<int, char>, Base<double, void>>
{};</code>
Salin selepas log masuk

Pendekatan ini membolehkan kelas terbitan mengakses pelaksanaan kelas asas yang betul tanpa perlu menggunakan pengisytiharan atau spesifikasi kelas asas secara eksplisit.

Memahami kesamaran dan melaksanakan penyelesaian berkesan dalam berbilang warisan dengan set bertindih membantu memastikan pelaksanaan kod yang jelas dan betul.

Atas ialah kandungan terperinci ## Bagaimana untuk Nyahkekaburan Panggilan Ahli Kelas dalam Berbilang Warisan dengan Set Jenis Bertindih?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!