首頁  >  文章  >  後端開發  >  如何避免繼承類別模板中公共成員不可見和原始碼重複?

如何避免繼承類別模板中公共成員不可見和原始碼重複?

DDD
DDD原創
2024-11-04 04:49:01805瀏覽

How to Avoid Public Member Invisibility and Source Code Repetition in Inherited Class Templates?

使用繼承的類別模板避免公共成員不可見和原始碼重複

在物件導向程式設計中,繼承允許類別繼承屬性和方法來自他們的父類別。但是,當引入類別範本時,由於嚴格遵守 C 標準,因此衍生類別可能無法存取公共成員。嘗試在衍生類別中引用公共成員時,此問題可能會導致問題。

針對此問題提出了四個現有解決方案:

  • 使用CBase 前綴引用;::
  • 使用此前綴引用->
  • 為每個成員使用單獨的using 語句
  • 禁用嚴格的C 合規性

雖然這些解決方案可以解決可訪問性問題,但它們也有潛在的缺點,例如冗長的程式碼、抑制虛擬呼叫和不可移植性。

建議的增強解決方案

為了改進現有解決方案,可以利用宏來簡化解決方案#3:

<code class="c++">#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>, in a `public:` section
USING_CBASE(BYTES);</code>

此方法需要加入CBase 定義附近的USING_CBASE 巨集;然後在CDerived 的公共部分中呼叫巨集。它本質上執行一攬子聲明,以使 CBase 的所有選取成員都可用。在 CDerived 中可見。

此解決方案透過將 using 語句封裝到巨集中,解決了解決方案 #3 的問題,例如重複程式碼。它還透過符合 C 標準來保持可移植性。這個增強的解決方案提供了一種更簡潔、更有效的方法來避免繼承類別模板中公共成員不可見且原始碼重複。

以上是如何避免繼承類別模板中公共成員不可見和原始碼重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn