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

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

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

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

这编译和工作就好了。 现在我扩展基地,但仍然想使用b:

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

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

显然,在b上增加公共getter解决了这个问题,但是我想知道为什么我不能直接访问b 。 我虽然说,当你使用公共inheritance保护variables仍然可见的派生类。

您只能在您的types的实例(或从您的types派生)访问受保护的成员。
您无法访问父级或表亲types实例的受保护成员。

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

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

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

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

另一个解决scheme是利用inheritance并传递给父方法:

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

protected成员可以访问:

  • 通过this指针
  • 或者即使在基地申报的情况下,也能保护相同types的受保护成员
  • 或从朋友类,function

为了解决你的情况,你可以使用最后两个选项之一。

接受Derived :: DoSomething中的派生或声明派生的friend到Base:

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

在某些情况下,你也可以考虑公共获得者。

使用this指针访问受保护的成员

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