Rumah >pembangunan bahagian belakang >C++ >Mengapakah Ahli Kelas Awam Tidak Kelihatan Apabila Mewarisi Kelas C Templat?

Mengapakah Ahli Kelas Awam Tidak Kelihatan Apabila Mewarisi Kelas C Templat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 09:25:021008semak imbas

Why Are Public Class Members Invisible When Inheriting Templated C   Classes?

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:

  1. Melabuhkan rujukan kepada ahli CBase dengan CBase::
  2. Memasukkan rujukan kepada ahli CBase dengan ini->
  3. Menggunakan pernyataan untuk ahli CBase tertentu dalam CDerived
  4. Melumpuhkan pematuhan ketat kepada standard C dengan mendayakan mod "permisif"

Kelemahan Penyelesaian Sedia Ada

Walaupun berkesan, penyelesaian ini mempunyai kelemahannya:

  • Penyelesaian #4 terlepas daripada standard C dan tidak mudah alih.
  • Penyelesaian #1 dan #2 memerlukan penambahan kod verbose, yang membawa kepada bloat kod sumber.
  • Penyelesaian #3 memerlukan penyataan penggunaan berbilang, terutamanya untuk kelas asas yang meluas.

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!

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