(我在这里搜索并阅读了 Diamond-and virtual-inheritance questions,但找不到答案。我的想法是这种情况有点不寻常,我愿意接受我的要求有些偏离的想法。关于另一方面,我认为这应该以“不错”的方式可行。)
情况及要求:
我有一个我无法控制且无法更改的 C++ 类库。它定义了一个Window
类。该类Window
有一个受保护的成员(例如:)handle
,不能以其他方式访问,派生类打算使用该成员。Window
定义了数百个(嗯,非常多的......)方法,我不想通过委托(比如在装饰器中)重新实现这些方法。
我想向 中添加功能Window
,以便派生类(我写的;说LogWindow
)自动具有。此类功能的一个示例是能够将窗口彼此对齐。为了实现这一点,我需要访问Window
受保护的handle
成员。
对于我的实际目的,这已经足够了,解决方案很简单:派生SnappableWindow
自Window
,并派生所有我的Window
派生类(LogWindow
在本例中)从SnappableWindow
。
然而,我真正想要的,更漂亮的恕我直言,是:
- 将这种“Snappable”功能作为独立代码片段的能力,我可以选择“插入”任何其他
Window
派生类,也可以不选择。 - 将这一概念扩展到其他功能的能力,例如最小化窗口的能力。所以我可以有一个
Window
- 派生类,有或没有“Snappable”能力,有或没有“Minimizable”能力。 - “SnappableWindow”和“MinimizableWindow”的实现都需要访问受保护
Window
的handle
成员。 - 我希望“Snappable”和“Minimizable”成为实际类声明的一部分,这样我的实际类(
LogWindow
)“是一个”窗口,“是一个”SnappableWindow,并且“是一个”MinimizableWindow。
...现在是问题:
我知道如何通过声明SnappableWindow
andMinimizableWindow
而不是从它们的构造函数中Window
获取 a来执行此操作handle
,然后LogWindow
从Window
and 的任意组合派生SnappableWindow
和派生MinimizableWindow
。
编辑:在调用了init()之后,在 LogWindow 的构造函数中途handle
被初始化。(而不是像我之前所说的那样,通过构造函数的一半)。Window
Window
Window
但是,由于handle
仅LogWindow
在 's 的构造函数中初始化(在它调用Window
's之后init()
),我不能将 is 传递给SnappableWindow
并MinimizableWindow
作为LogWindow
's 的构造函数初始化列表的一部分。相反,我必须init()
在两者上显式调用一些方法,并将其传递给handle
. 而这,在我的每个Window
派生类中。( LogWindow
, SearchWindow
,PreferencesWindow
等)
我正在寻找一种能够执行以下操作的方法:
类 LogWindow:公共窗口、公共 SnappableWindow、公共 MinimizableWindow
...并且不必在内部实现任何其他内容LogWindow
。我已经摆弄虚拟继承,但不能完全想出解决方案。