相关疑难解决方法(0)

访问派生类中的受保护成员

我昨天遇到了一个错误,虽然它很容易解决,但我想确保我正确理解C++.

我有一个受保护成员的基类:

class Base
{
  protected:
    int b;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
    }
};
Run Code Online (Sandbox Code Playgroud)

这编译并且工作得很好.现在我扩展Base但仍想使用b:

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
      d=0;
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下DoSomething仍然参考a Base,而不是Derived.我希望我仍然可以访问that.b内部Derived,但我得到一个cannot access protected member错误(MSVC 8.0 - 还没有尝试过gcc).

显然,添加一个公共getter b解决了这个问题,但我想知道为什么我无法直接访问b.我认为,当您使用公共继承时,受保护的变量对派生类仍然可见.

c++

56
推荐指数
3
解决办法
6万
查看次数

无法调用基类保护函数?

我不能在我的基类中调用protected函数.为什么?它看起来像这样:

class B : B2
{
public:
  virtual f1(B*)=0;
protected:
  virtual f2(B*) { codehere(); }
}
class D : public B
{
public:
  virtual f1(B*b) { return f2(b); }
protected:
  virtual f2(B*b) { return b->f2(this); }
}
Run Code Online (Sandbox Code Playgroud)

在msvc中我得到错误错误C2248:'name :: class :: f2':无法访问类'name :: class'中声明的受保护成员

在gcc中我得到错误:'virtual int name :: class :: f2()'受到保护.

这是为什么?我认为受保护成员的要点是派生类调用.

c++ inheritance

7
推荐指数
1
解决办法
6197
查看次数

标签 统计

c++ ×2

inheritance ×1