首页  >  文章  >  后端开发  >  为什么继承模板化 C 类时公共类成员不可见?

为什么继承模板化 C 类时公共类成员不可见?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-04 09:25:02952浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn