首頁 > 後端開發 > C++ > 為什麼繼承模板化 C 類別時公共類別成員不可見?

為什麼繼承模板化 C 類別時公共類別成員不可見?

Mary-Kate Olsen
發布: 2024-11-04 09:25:02
原創
1040 人瀏覽過

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

繼承模板化C 類別中的受保護和公共類別成員可見性

當類別模板繼承時,繼承中的公共成員可見性問題變得明顯來自另一個類別模板​​的成員,如提供的程式碼所示。在沒有明確地重新聲明或重新定義任何公共成員的情況下,CDerived 繼承了 CBase 的所有公共成員。

問題和解決方案

但是,將此程式碼模板化後,會發現CBase 的公共成員在遵循最新C 標準的編譯器上,CDerived 變得不可見。可以使用多種解決方案解決此可見性問題:

  1. 使用CBase::
  2. 對CBase 成員的引用添加前綴->
  3. 對CBase 成員的引用加入前綴this->
  4. 在CDerived 中對特定CBase 成員使用using語句
  5. 透過啟用「寬容」模式來停用對C 標準的嚴格遵守

現有解決方案的缺點

這些解決方案雖然有效,但也有其缺點:
  • 解#4 脫離了 C標準且不可移植。
  • 解決方案 #1 和 #2需要添加詳細程式碼,導致原始碼膨脹。
  • 解 #3 需要多個 using 語句,特別是對於大量基底類別。

更簡潔的解決方案

引入宏簡化了解決方案#3,減少了重複輸入:
<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>
登入後複製

這段落程式碼大大簡化了using 語句,提高了程式碼可讀性並減少了重複編輯。

以上是為什麼繼承模板化 C 類別時公共類別成員不可見?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板