Nyahkekaburan dalam Berbilang Warisan dengan Jenis Bertindih
Warisan berbilang boleh membawa kepada samar-samar panggilan ahli kelas apabila kelas asas yang berbeza mempunyai set tidak bertindih jenis yang berkenaan untuk kaedah polimorfik. Pertimbangkan senario di mana templat kelas asas variadic, Base, mentakrifkan kaedah, foo(), yang hanya boleh digunakan dengan parameter templat yang terkandung dalam pek parameter jenisnya.
Dalam contoh kami:
<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"; } };
Kita boleh memperoleh kelas, Derived, yang mewarisi dua kali daripada Base dengan set jenis tidak bertindih:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> {};</code>
Apabila memanggil Derived().foo
Mengapa Pengkompil Tidak Dapat Menyelesaikan Kekaburan
Peraturan gabungan untuk kelas -member lookup menyatakan bahawa jika set pengisytiharan kelas terbitan (dalam kes ini, Derived) kosong, set carian untuk ahli (dalam kes ini, foo) digabungkan daripada semua kelas asas langsung. Walau bagaimanapun, memandangkan kelas asas kami mempunyai set pengisytiharan yang berbeza untuk foo, cantuman adalah samar-samar.
Penyelesaian
Untuk menyelesaikan kekaburan, kami boleh membuat set pengisytiharan Terbitan tidak kosong dengan menambah menggunakan pengisytiharan untuk kaedah foo dalam asas:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> { using Base<int, char>::foo; using Base<double, void>::foo; };</code>
Menggunakan pengisytiharan membawa ahli daripada kelas asas ke dalam kelas terbitan, dengan berkesan menyediakan Derived dengan dua lebihan foo. Pengkompil kemudian boleh memanggil lebihan beban yang sesuai dengan jelas.
Penyelesaian Alternatif
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kekaburan dalam Berbilang Warisan dengan Jenis Bertindih Apabila Memanggil Kaedah Polimorfik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!