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

我有一个 protected 成员的基类:

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。我希望我仍然可以访问that.b内部的Derived,但是会收到cannot access protected member错误(MSVC 8.0-尚未尝试gcc)。

显然,在b上添加一个公共(public)getter可以解决问题,但是我想知道为什么我无法直接访问b。我虽然在您使用公共(public)继承时, protected 变量仍然对派生类可见。

最佳答案

一个类只能访问该类或派生类的实例的 protected 成员。它不能访问父类或表亲类实例的 protected 成员。

在您的情况下,Derived类只能访问b实例的受Derived保护的成员,而不能访问Base实例的成员。

更改构造函数以使用Derived实例将解决此问题。

09-09 23:46