将友谊与继承结合起来访问私有数据成员是否可以

时间:2011-11-23 12:46:12

标签: c++ inheritance encapsulation friend

我们假设我想要一个单独的Child类,并且只有这个类继承自Father 并授予Child访问Fathers数据成员的权限。除此之外,没有人应该从父亲那里继承到其内部,因此我保留了父亲私人的数据

编辑:我选择了保护,因为我想隐藏数据。有些人提倡这是一种良好的做法,但也许它有点过于教条:(例如,http://drdobbs.com/184403867中的Herb Sutter)实际上,这个课程应该只延长一次。因此,史蒂夫杰西普指出禁止继承可能是一种选择,但我认为其成本(虚拟等)对我所需要的东西来说太过分了。

代码看起来像这样:

class Father{
  friend class Child;
  public: 
    //functions
  private:
    int mData;
}

class Child: public Father{
  public:
    void changeData(int val){mData=val;}
}

我在这里遇到了一些严重的麻烦,或者这是一个有效的决定,假设继承是一个好的决定。

3 个答案:

答案 0 :(得分:5)

这实际上并没有阻止其他人使用Father作为基类,只是阻止他们访问mData

如果这是您想要的(Child具有对Father的特权访问权限,那么其他类没有,并且Child碰巧也有一个基类{{ 1}}无关),很好。

如果你另外禁止其他人使用Father作为基类(通过单独的文档,或者使用虚拟基类的技巧),那么使用Father会变得有点无意义。你可能只是让friend受保护而不是私有,这正是受保护的目的。

答案 1 :(得分:1)

protected:访问说明符是出于完全相同的目的而引入的。

虽然这会授予会员访问 Child的所有 Father的权限,但从长远来看,此设计更清晰,更易于维护。

答案 2 :(得分:0)

如果Child是唯一应该继承Father的类,那么您可以在Father中声明要转移到Child的成员和方法(但是你仍然希望保密,而不是保密。

就像私人一样,受保护无法从外部访问。

与private相对,protected是继承的。