c ++中基类中受保护字段的问题

der*_*dji 6 c++ inheritance field protected

我有一个基类,比如BassClass,有一些字段,我让它们受到保护,还有一些纯虚函数.然后派生类,比如说DerivedClassclass DerivedClass : public BassClass.DerivedClass不应该从BassClass继承受保护的字段吗?当我尝试编译DerivedClass时,编译器抱怨DerivedClass没有任何这些字段,这里有什么问题?谢谢

Man*_*agu 11

如果BassClass(原文如此)并且DerivedClass是模板,并且BassClass您要访问的成员DerivedClass未指定为从属名称,则它将不可见.

例如

template <typename T> class BaseClass {
protected: 
    int value;
};

template <typename T> class DerivedClass : public BaseClass<T> {
public:
    int get_value() {return value;} // ERROR: value is not a dependent name
};
Run Code Online (Sandbox Code Playgroud)

要获得访问权限,您需要提供更多信息.例如,您可以完全指定成员的名称:

    int get_value() {return BaseClass<T>::value;}
Run Code Online (Sandbox Code Playgroud)

或者你可以明确指出你是指一个类成员:

    int get_value() {return this->value;}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,这种模板行为的原因是,在定义DerivedClass模板时,编译器无法知道`BaseClass <T>`是否会有成员`value`.你可能会专门研究`BaseClass <int>`以便它没有一个,然后尝试实例化`DerivedClass <int>`.所以模板定义应该被拒绝.通过添加额外的信息,你说"没关系,'值'取决于`T`,所以不要指望它能找到它". (5认同)
  • 或者,我们可以在派生类声明中使用BaseClass <T> :: value;`,这将允许派生类的其余部分简单地调用`value`. (2认同)