ホームページ > バックエンド開発 > C++ > 継承されたクラス テンプレートでパブリック メンバーの非表示とソース コードの繰り返しを回避するにはどうすればよいですか?

継承されたクラス テンプレートでパブリック メンバーの非表示とソース コードの繰り返しを回避するにはどうすればよいですか?

DDD
リリース: 2024-11-04 04:49:01
オリジナル
871 人が閲覧しました

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

継承されたクラス テンプレートによるパブリック メンバーの非表示とソース コードの繰り返しの回避

オブジェクト指向プログラミングでは、継承によりクラスがプロパティとメソッドを継承できるようになります。親クラスから。ただし、クラス テンプレートが導入されると、C 標準に厳密に準拠しているため、パブリック メンバーが派生クラスにアクセスできなくなる可能性があります。この問題は、派生クラスでパブリック メンバーを参照しようとすると問題を引き起こす可能性があります。

この問題に対しては、次の 4 つの既存の解決策が提案されています。

  • 参照の前に CBase を付ける;::
  • 参照の前に this を付ける->
  • メンバーごとに個別の 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 の public セクション内でマクロを呼び出します。基本的に、CBase の選択されたすべてのメンバーを作成する包括的な宣言を実行します。 CDerived で表示されます。

この解決策は、using ステートメントをマクロにカプセル化することで、繰り返しコードなどの解決策 #3 の問題に対処します。また、C規格に準拠することで移植性も保っています。この強化されたソリューションは、継承されたクラス テンプレートでのパブリック メンバーの非表示やソース コードの繰り返しを回避する、より簡潔かつ効率的な方法を提供します。

以上が継承されたクラス テンプレートでパブリック メンバーの非表示とソース コードの繰り返しを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート