【问题标题】:Problem with protected fields in base class in c++c++中基类中受保护字段的问题
【发布时间】:2010-12-21 06:48:50
【问题描述】:

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

【问题讨论】:

  • 是的,您所描述的听起来应该可以。这可能归结为您的代码是如何编写的。给我们一个重新创建编译器错误的基本示例,然后我们可以为您提供帮助。
  • 您是从模板类继承的吗?如果是这样,则需要在从基类访问成员变量时使用this->。
  • “继承受保护的字段”是什么意思?任何子类总是具有其基类的所有字段,无论它们是公共的、受保护的还是私有的。问题是谁可以访问它们 - 如果成员受到保护,这意味着只有 DerivedClass 内部的代码可以访问该成员,而 DerivedClass 外部查看 DerivedClass 类型的对象的代码无法访问它。

标签: c++ inheritance field protected


【解决方案1】:

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

例如

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
};

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

    int get_value() {return BaseClass<T>::value;}

或者你可以明确指出你指的是一个班级成员:

    int get_value() {return this->value;}

【讨论】:

  • 顺便说一句,这种模板行为的原因是,在定义 DerivedClass 模板时,编译器无法知道 BaseClass&lt;T&gt; 是否会有成员 @987654329 @ 或不。您可能会晚专门化BaseClass&lt;int&gt;,使其没有一个,然后尝试实例化DerivedClass&lt;int&gt;。所以模板定义应该被拒绝。通过添加额外信息,您的意思是“没关系,value 是什么取决于 T,所以不要指望能够找到它”。
  • 另外,我们可以在派生类声明中使用using BaseClass&lt;T&gt;::value;,这将允许派生类的其余部分简单地调用value
【解决方案2】:

这行得通:

#include <iostream>

struct Base {
virtual void print () const = 0;
protected:
int val;
};

struct Derived : Base {
void print () { std::cout << "Bases's val: " << val << std::endl; }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2020-07-28
    • 2012-05-26
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多