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

Mar*_*tin 1 c++ inheritance encapsulation friend

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

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

代码看起来像这样:

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

class Child: public Father{
  public:
    void changeData(int val){mData=val;}
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*sop 5

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

如果这是你想要的(Child具有特权访问权限Father,其他类没有,并且Child碰巧也有基类的事实Father是无关的),那很好.

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