Rumah >pembangunan bahagian belakang >C++ >Mengapakah Ahli Kelas Awam Tidak Kelihatan Apabila Mewarisi Kelas C Templat?
Mewarisi Keterlihatan Ahli Kelas Terlindung dan Awam dalam Kelas C Templat
Isu keterlihatan ahli awam dalam warisan menjadi jelas apabila templat kelas mewarisi ahli daripada templat kelas lain, seperti yang ditunjukkan dalam kod yang disediakan. Tanpa mengisytiharkan semula atau mentakrifkan semula mana-mana ahli awam secara eksplisit, CDerived mewarisi semua ahli awam CBase.
Masalah dan Penyelesaian
Templat kod ini, bagaimanapun, mendedahkan bahawa ahli awam CBase menjadi tidak kelihatan kepada CDerived pada penyusun yang mematuhi piawaian C terkini. Isu keterlihatan ini boleh diatasi menggunakan beberapa penyelesaian:
Kelemahan Penyelesaian Sedia Ada
Walaupun berkesan, penyelesaian ini mempunyai kelemahannya:
Penyelesaian Kurang Verbose
Memperkenalkan makro memudahkan Penyelesaian #3, mengurangkan penaipan berulang:
<code class="cpp">#include <boost/preprocessor.hpp> #define USING_ONE(r, base, member) using base::member; #define USING_ALL(base, ...) BOOST_PP_SEQ_FOR_EACH(USING_ONE, base, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) // Near CBase<BYTES> #define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5) // In CDerived<BYTES> USING_CBASE(BYTES);</code>
Kod ini sangat memudahkan penyataan penggunaan, meningkatkan kebolehbacaan kod dan mengurangkan suntingan berulang.
Atas ialah kandungan terperinci Mengapakah Ahli Kelas Awam Tidak Kelihatan Apabila Mewarisi Kelas C Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!