As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center 指导。
9年前关闭。
我知道友元不是遗传的。我问自己:为什么?为什么 C++ 设计者决定不让友元被继承?你觉得友元继承是一件有用的事情吗?我自己的回答是肯定的:就像 B 是 A 的 friend 一样,我想让整个类家族成为 A(B 及其衍生物)的 friend 。也许,人们应该可以说:让 只有 B 是 A 的 friend ,或者让 B 和 其派生类是 A 的 friend 。
附言。
我不知道为什么你们中的许多人认为我要求自动延长友元。我对程序员使用某种机制(不是自动)将友元扩展到整个家庭的可能性更感兴趣。 它将 Friendly 与 Trusting 的表示联系起来,因为它可以完全访问其内部 表示友好发誓维护信任 的类不变量
因此,确保清楚地确定确切的范围似乎是一种很好的做法,这是继承无法实现的:会有泄漏。
事实是,继承甚至不应该是必要的。实际上有两种选择,这取决于友元试图实现的目标。它们涵盖了我遇到的任何场景。
友好 作为代理
在您的示例中,
不太信任
在这种情况下,
我必须承认,我确实偏爱后一种方法并经常使用它,因为它限制了
9年前关闭。
我知道友元不是遗传的。我问自己:为什么?为什么 C++ 设计者决定不让友元被继承?你觉得友元继承是一件有用的事情吗?我自己的回答是肯定的:就像 B 是 A 的 friend 一样,我想让整个类家族成为 A(B 及其衍生物)的 friend 。也许,人们应该可以说:让 只有 B 是 A 的 friend ,或者让 B 和 其派生类是 A 的 friend 。
附言。
我不知道为什么你们中的许多人认为我要求自动延长友元。我对程序员使用某种机制(不是自动)将友元扩展到整个家庭的可能性更感兴趣。
最佳答案
friend
声明在友好和信任之间建立了牢固的关系:
因此,确保清楚地确定确切的范围似乎是一种很好的做法,这是继承无法实现的:会有泄漏。
事实是,继承甚至不应该是必要的。实际上有两种选择,这取决于友元试图实现的目标。它们涵盖了我遇到的任何场景。
友好 作为代理
在您的示例中,
Friendly
的派生类可以通过 Trusting
简单地进入 Friendly
,从而让您可以控制在有限的一组地方发生在 Trusting
上的操作。class Trusting { friend class Friendly; };
class Friendly { protected: void modifyTrusting(); };
modifyTrusting
的实现可能意味着虚拟调用(钩子(Hook))来定制行为,但不管这些钩子(Hook)如何,Friendly
来确保类不变量不被破坏。不太信任
在这种情况下,
Trusting
通过锁定方法仅打开其接口(interface)的一部分,并将 key 授予 Friendly
。 Friendly
也可能将 key 授予它信任的类,但这并不重要……无论如何,Trusting
确保自己的不变量不被破坏,而 key 只是一种减少方法暴露的机制.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
的哪些部分。关于C++ 友元与继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7453947/
10-10 05:11