首页 > 后端开发 > C++ > 正文

为什么继承类模板时基类的公共成员变得不可见?解决这个问题的方法是什么?

Susan Sarandon
发布: 2024-11-02 15:13:30
原创
258 人浏览过

Why do public members of a base class become invisible when inheriting a class template, and what are the solutions to this problem?

避免继承类模板中公共成员不可见和代码膨胀

面向对象编程依赖于受保护和公共类成员的继承。在非模板化环境中,这种继承很简单。然而,在引入类模板时,出现了一个基本问题:基类的公共成员对于派生类模板来说变得不可见。

问题

考虑以下示例:

<code class="cpp">class CBase
{
public:
    int Fn1(void) { ... }
};

class CDerived : public CBase
{
public:
    int FnSum(void) { ... CBase::Fn1(); ... }
};</code>
登录后复制

当模板化此代码时,CBase 的 Fn1() 成员从 CDerived 的角度消失:

<code class="cpp">template<unsigned int BYTES>
class CBase
{
public:
    int Fn1(void) { ... }
};

template<unsigned int BYTES>
class CDerived : public CBase<BYTES>
{
public:
    int FnSum(void) { ... Fn1(); ... } // Error: Fn1 not found!
};</code>
登录后复制

解决方案

有多种解决方案可以解决此问题:

解决方案 1(详细前缀):

<code class="cpp">int FnSum(void) {
    return CBase<BYTES>::Fn1() + CBase<BYTES>::Fn2() + CBase<BYTES>::Arr[0];
}</code>
登录后复制

但是,这种方法在引用多个成员时会导致过多的代码膨胀。

解决方案 2(详细的“this->”前缀):

<code class="cpp">int FnSum(void) {
    return this->Fn1() + this->Fn2() + this->Arr[0];
}</code>
登录后复制

与解决方案 1 类似,但稍微简洁一些。

解决方案 3(使用语句):

<code class="cpp">using CBase<BYTES>::Arr;
using CBase<BYTES>::Fn1;
using CBase<BYTES>::Fn2;</code>
登录后复制

这允许直接访问 CBase 成员,无需额外前缀。

解决方案 4(宽容模式):

<code class="cpp">// Compiler flags: /permissive- (MSVC), -fpermissive (GCC/Cl), -fno-implicit-templates (Clang)</code>
登录后复制

禁用严格的 C 合规性,解决了问题,但可能会引入可移植性问题。

更好的解决方案

虽然解决方案 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__))

#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)</code>
登录后复制

在派生类中:

<code class="cpp">USING_CBASE(BYTES); // Makes all mentioned CBase members directly accessible</code>
登录后复制

这种方法显着减少了代码膨胀和重复。

以上是为什么继承类模板时基类的公共成员变得不可见?解决这个问题的方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!