【问题标题】:C++ Friendship and inheritance [closed]C ++友谊和继承[关闭]
【发布时间】:2011-11-19 05:12:18
【问题描述】:

我知道友谊不是遗传的。我在问自己:为什么?为什么 C++ 设计者决定不让友谊被继承?你觉得友谊继承会有用吗?我自己的回答是肯定的:就像 B 是 A 的朋友一样,我想让整个班级成为 A(B 及其派生词)的朋友。也许,应该可以说:only B 成为 A 的朋友,或者让 B 其派生类成为 A 的朋友。

附言。 我不知道为什么你们中的许多人认为我是在要求自动延长友谊。我对程序员使用某种机制(不是自动)将友谊扩展到整个家庭的可能性更感兴趣。

【问题讨论】:

  • 你没有展示一个引人注目的用例。就个人而言,我看不到它的用处。在大多数情况下,您不需要继承友谊,因为您可以使用普通继承:函数 foo(A&)A 的朋友,当然也适用于 B 类型的参数。
  • Friendship 的全部目的是表明两个具有强耦合的实体,允许友谊被继承并沿着层次结构传播,这将打破友谊存在的基础,也打破了友谊的存在。非常 OOP 原则。
  • 我想你想等待模块(例如C#中的internal保护级别或Java中的default保护级别)。这样的事情可以允许一组类(同一个模块中的那些)访问默认/内部属性。
  • 所以我写了一个 DB 类和 DB worker 类,因为 worker 是 DB 的朋友(因为我一起实现了它们,我知道我可以相信工人不会表现得不好)。现在您一起编写从 DB 工作者继承的 EvelWorker。我的数据库绝对不喜欢 EvelWorker,因为您不知道数据库内部是如何工作的。

标签: c++ inheritance friend access-control


【解决方案1】:

我昨天看到一个有趣的保险杠贴纸:“我的岳母是一名旅行社......内疚旅行”。友谊在某种程度上是在人际关系中继承下来的。虽然这确实会引发关于 SO 的朋友和家人的有趣笑话,但重要的是要记住,痛苦和苦难是许多笑话的基础。

友谊不会在 C++ 中继承,因为开发人员预见到了这会导致的痛苦和痛苦的数量。

【讨论】:

    【解决方案2】:

    这是一个糟糕的主意。

    友谊不会被继承,因为友谊会导致朋友之间的紧密耦合。如果所有派生类也自动成为朋友,那么这将导致原始对象和所有继承类之间的紧密绑定。

    紧密耦合适用于一起创建和维护的类。但是对于由其他用户创建的类,紧耦合会导致维护噩梦并阻止您更改原始对象(因为您所有紧耦合的朋友都依赖于您的实现)。

    【讨论】:

      【解决方案3】:

      friend 声明在友好和信任之间建立了牢固的关系:

      • 它将 Friendly 与 Trusting 的表示联系在一起,因为它可以完全访问其内部结构
      • 这意味着 Friendly 发誓维护 Trusting 的类不变量

      因此,确保清楚地确定确切的范围似乎是一种很好的做法,这是继承无法实现的:会有泄漏。

      事实上,继承甚至不应该是必要的。实际上有两种选择,具体取决于友谊试图实现的目标。它们涵盖了我遇到的任何场景。

      友好作为代理

      在您的示例中,Friendly 的派生可以简单地通过Friendly 到达Trusting,从而让您在有限的一组位置控制Trusting 上发生的操作。

      class Trusting { friend class Friendly; };
      
      class Friendly { protected: void modifyTrusting(); };
      

      modifyTrusting 的实现可能意味着虚拟调用(钩子)来自定义行为,但不管这些钩子如何,都需要 Friendly 来确保不会破坏类不变量。

      不是那么信任

      在这种情况下,Trusting 通过 lock 方法仅打开其部分界面,并将密钥授予FriendlyFriendly 也可以将密钥授予它信任的类,但这并不重要......无论如何Trusting 确保它的不变量不会被破坏,并且密钥只是一种减少曝光的方法。

      class Key { friend class Friendly; Key() {} ~Key() {} };
      
      class Trusting { public: void doSomething(Key const&); };
      
      class Friendly { protected: Key const& key() const; };
      

      我必须承认我真的很偏爱后一种方法并经常使用它,因为它将Friendly的曝光限制在Trusting的实现细节上。它还清楚地记录了Trusting 我们亲爱的Friendly 访问的哪些部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-16
        • 2013-10-10
        • 2010-10-10
        • 2016-05-04
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2011-09-28
        相关资源
        最近更新 更多