C++如何优雅地处理不被继承的友谊

Posted

技术标签:

【中文标题】C++如何优雅地处理不被继承的友谊【英文标题】:C++ how to elegantly deal with friendship not being inherited 【发布时间】:2011-11-28 10:40:00 【问题描述】:

我有一组课程

class myClassA
    friend class MyFatherClass;
;

class MyFatherClass
    ...
;

class MySonClass : public MyFatherClass 
;

我的父类可以访问 MyClassA 类的所有方法。 我也希望所有扩展 MyFatherClass 的类都能够调用这样的方法。

我只能看到 2 个选项:

    我可以随时将新班级添加到 myClassA 中作为朋友。 (不喜欢) 我在父函数中创建了一些受保护的包装器来访问类 myClassA 中的方法。 (稍微好一点,但我仍然不喜欢它,因为我必须随时在 myClassA 中创建新方法时创建一个新包装器)

你有什么更优雅的解决方案的想法吗?

谢谢

【问题讨论】:

通过扩展,您只能访问 public & protected 成员,而 friend 可以访问所有内容。 已更正,您在继承中有错字:) myClassA中有多少个派生类,多少个成员函数?太多的东西都是代码味道,但也许你有你的理由...... 目前儿子班不多...只有 3 个,但以后可能会增加。 使用10-15左右友情调用的方法 【参考方案1】:

首先...优雅是什么意思?更少的代码让你写?我建议您在可读性方面不要妥协。

使用友谊不应该是一个轻率的决定。有很多关于 SO 处理这个问题的线程,但在这里我假设你已经知道这意味着什么。

选项 1) 更具可读性。当有人看到该类时,他们将直接知道谁可以访问它。代码应该是富有表现力的,并且这个选项完美地描述了意图。

选项 2) 有点矫枉过正。您正在编写一个包装器,以便您可以访问某些功能......为什么不让它们开始public,因为包装器具有公共访问权限。它只是一个额外的抽象层。

您应该首先考虑功能(两者都有效)、表现力和可读性(选项 1 在这里肯定更好)。

【讨论】:

好吧...在选项 2 中,我本来希望将包装器声明为受保护的。至少只有继承才有可能调用这些方法。 bublic 可能有点太危险了。无论如何感谢您的意见.. :)【参考方案2】:

对应用程序知之甚少很难做出判断,但如果函数应该MyFatherClass 及其后代使用,它们应该是protected 成员(也许static) 的 MyFatherClass

也许MyClassA 应该是MyFatherClass 的成员,没有自己的成员函数,只是一个struct 来保存一些数据成员。

class MyFatherClass 
protected:
    struct myStructA 
        int state;
    ;

    static void DoSomething( myStructA &a );
    …
;

只是一个建议……鉴于如此少的信息,很难说出什么是最好的。一般的想法是该语言不允许friendship 继承,因为没有它你总是可以做出好的设计。

【讨论】:

以上是关于C++如何优雅地处理不被继承的友谊的主要内容,如果未能解决你的问题,请参考以下文章

C++继承:派生类的虚方法不被调用[重复]

C++ 多态继承问题的优雅解决方案

C++ 面试题

友谊得到继承??奇怪的

优雅地实现JavaScript的继承

为啥构造函数在java中不被继承?