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

Is it ok to combine friendship with inheritance to access private data members

本文关键字:访问 起来 数据成员 结合 继承 友谊 是否      更新时间:2023-10-16

让我们假设我想要一个单一的类Child,并且只有这个类继承自Father并授予Child对father数据成员的访问权。除此之外,任何人都不应该继承father来访问它的内部,因此我将father的数据保留为私有

编辑:我选择不保护,因为我想要隐藏数据。有些人认为这是一个很好的实践,但也许这有点太教条了:(例如Herb Sutter在http://drdobbs.com/184403867)实际上,这个类应该只扩展一次。因此,正如Steve Jessop指出的那样,禁止继承将是一个选择,但我认为这样做的成本(虚拟等)对我所需要的来说太大了。

代码看起来像这样:

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

我在这里遇到了一些严重的问题吗?或者假设继承首先是一个好决定,那么这是一个有效的决定吗?

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

如果这就是你想要的(Child有特权访问Father,其他类没有,Child碰巧也有一个基类Father是无关的),很好。

如果您另外禁止任何人使用Father作为基类(无论是单独通过文档,还是使用虚拟基类的技巧),那么使用friend就变得有点毫无意义了。您不妨将mData设置为protected而不是private,这正是protected的作用。

protected:访问说明符的引入也是出于同样的目的。

虽然这将授予成员访问所有Father Child,但从长远来看,这种设计更简洁,更易于维护。

如果Child是唯一一个应该继承Father的类,那么你可以在Father中声明那些你想转移到Child的成员和方法(但你仍然想从其他类中保持"secret")保护而不是私有。

就像private一样,protected不能从外部访问。