首页 >后端开发 >C++ >如何避免继承类模板中公共成员不可见和源代码重复?

如何避免继承类模板中公共成员不可见和源代码重复?

DDD
DDD原创
2024-11-04 04:49:01863浏览

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