访问基类的公共成员失败

Posted

技术标签:

【中文标题】访问基类的公共成员失败【英文标题】:Accessing public members of base class fails 【发布时间】:2011-09-02 08:41:48 【问题描述】:

可能是一个有点懦弱的问题:我有两个类,并将所有变量声明为 public。为什么我不能访问派生类的变量??

g++ 告诉我:vec3d.h:76:3: error: ‘val’ is not declared in this scope

template<typename TYPE>
class vec
public:
        TYPE *val;
        int dimension;
public:
        vec();
        vec( TYPE right );
        vec( TYPE right, int _dimension );

[etc]


template<typename TYPE>
class vec3d : public vec<TYPE>
public:
        vec3d() : vec<TYPE>( 0, 3 );
        vec3d( TYPE right ) : vec<TYPE>( right, 3 );
        vec3d( TYPE X_val, TYPE Y_val, TYPE Z_val ) : vec<TYPE>( 0, 3 )
                val[0] = X_val; //// <----------THIS ONE FAILS!
                val[1] = Y_val;
                val[2] = Z_val;
        ;
[etc]

【问题讨论】:

你能把那个代码中的所有cmets都去掉吗,真的很难读... Access protected member of a class in a derived class 的可能重复项 为了将来参考,如果您将这个问题简化为 10 行示例,而没有完整的向量和“[etc]”,那么这个问题会更容易阅读。见Short, Self Contained, Correct (Compilable), Example。 是的,现在它更清楚了...我认为这与公开声明有关...所有教程都受保护...就像在副本中一样。由于这不是问题,我本可以使用其他线程 - 对不起,伙计们;) 我删除了 cmets。无论如何,它们大多一文不值。 【参考方案1】:

这纯粹是一个查找问题,与访问控制无关。

因为vec3d 是一个模板,并且它的基类依赖于模板参数,所以基类的成员在非依赖表达式的派生类中不会自动可见。最简单的解决方法是使用依赖表达式(例如 this-&gt;X_val)来访问基类的成员。

【讨论】:

好的,这回答了我的另一个问题^^谢谢 哦...所以如果类不是模板化的,这个概念会起作用吗?? 派生类不是类模板或者基类不依赖派生类模板的任何模板参数都可以。【参考方案2】:

您需要通过this-&gt;valvec&lt;TYPE&gt;::val 联系他们。 this answer to a similar question有很好的解释。

【讨论】:

谢谢...所以他们不是新班级的实际成员,虽然定义为公开的?? 他们仍然是成员,这是一个名称查找问题。与不合格的情况相比,他们需要稍后进行查找。

以上是关于访问基类的公共成员失败的主要内容,如果未能解决你的问题,请参考以下文章

访问控制与继承

继承是真的吗?

为啥我不能使用子类的指针访问基类的公共函数?

5继承与派生2-访问控制

访问基类的受保护成员

通过基类指针C++访问派生类的成员