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

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

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

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

这编译和工作很好。 现在我扩展Base但仍想使用b:

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

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

显然,在b上添加公共getter解决了这个问题,但我想知道为什么我不能直接访问b 。 我虽然说,当你使用公有继承时,受保护的变量对派生类仍然是可见的。


您只能在您的类型的实例(或派生自您的类型)中访问受保护的成员。
您无法访问父代或表亲类型实例的受保护成员。

在你的情况下, Derived类只能访问Derived实例的b成员,而不能访问不同的Base实例。

更改构造函数以获取Derived实例也将解决该问题。


您可以访问Derived的受保护成员,但不能访问Base那些成员(即使它是Derived的受保护成员的唯一原因是因为它是从Base继承的)


如前所述,这只是语言的工作方式。

另一个解决方案是利用继承并传递给父方法:

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      Base::DoSomething(that);
      d=0;
    }
};
链接地址: http://www.djcxy.com/p/23335.html

上一篇: Accessing protected members in a derived class

下一篇: downcasted pointer to member as template argument