c++ - 将友元与继承结合起来访问私有(private)数据成员是否可以

标签 c++ inheritance encapsulation friend

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

编辑:我选择不保护,因为我想隐藏数据。有些人提倡这是一种很好的做法,但也许它有点太教条了:(例如 http://drdobbs.com/184403867 中的 Herb Sutter)实际上,该类(class)应该只延长一次。因此,正如 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 目的。

关于c++ - 将友元与继承结合起来访问私有(private)数据成员是否可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242419/

相关文章:

c# - 避免在基类中使用泛型列表——我应该对字典遵循相同的规则吗?

domain-driven-design - DDD - 管理域和存储库之间的耦合

c++ - 带有 LibCurl 的 HTTP POST

c# - 一般读取格式正确的二进制文件

c++ - 检查类是否是模板专用化(使用 bool 或 int 等模板参数)

css - 几个 CSS 继承问题

java - 如何在执行操作时从操作中获取请求参数

javascript - 在模块模式中封装 "object factory"是否会使对象原型(prototype)消耗更多内存?

java - 如何在不返回集合本身的情况下返回集合的数据?

c++ - 如何将编译时 std::array "expand"放入参数包中?