(我搜索和閱讀直通這裏的金剛石和虛擬繼承問題,但找不到答案。我的想法是,這種情況有點反常,我。願意接受的想法,我的要求是有點不同。另一方面,我想這應該在一個「好」的方式是可行的)C++「三角」(而不是鑽石)繼承
的情況和要求:
我有一個C++類我無法控制的圖書館,以及我無法改變的圖書館。它定義了一個Window
類。 Window
類有一個受保護的成員(說:handle
),無法以其他方式訪問,派生類將用於使用。 Window
定義了數百個(以及非常大數量的)方法,我不關心通過委託來重新實現(例如在裝飾器中)。
我想添加功能Window
,以便派生類(我寫;說LogWindow
)自動具有。這種功能的一個例子是能夠將窗口彼此對齊。爲了實現這一點,我需要訪問Window
的受保護的handle
成員。
對於我的現實生活的目的,這是不夠的,解決方法很簡單:獲得來自Window
SnappableWindow
,並從SnappableWindow
帶來的一切我Window
派生類(LogWindow
在這個例子中)。
不過,我想真的想要的東西,而且是漂亮恕我直言,是:
- 有這個「Snappable」功能作爲一個獨立的代碼,我可以選擇「插件的能力成「任何其他
Window
派生類,或不。 - 也可以將這個概念擴展到其他功能,例如最小化窗口的能力。所以我可以有
Window
派生的職業,有或沒有「Snappable」能力,有或沒有「最小化」能力。 - 「SnappableWindow」和「MinimizableWindow」的實現都需要訪問
Window
的handle
保護成員。 - 我想將「Snappable」和「Minimizable」作爲實際類聲明的一部分,這樣我的實際類(
LogWindow
)就是一個「Window」,它是一個「SnappableWindow,」是一個「MinimizableWindow」。
...現在的問題:
我得到我如何與聲明SnappableWindow
和MinimizableWindow
爲不從Window
推導,但在其構造而獲得一個handle
,然後得出這樣做LogWindow
,從Window
和SnappableWindow
和MinimizableWindow
的任意組合。
編輯:handle
初始化,在Window
,中途通過LogWindow的構造函數,它調用Window
的init()後。 (而不是前面說過的Window
的構造函數的一半)。
然而,因爲handle
只有一半初始化方式通過LogWindow
的構造函數(它叫Window
後的init()
),我能不能通過是SnappableWindow
和MinimizableWindow
爲LogWindow
的構造函數初始化列表的一部分。相反,我必須明確地調用一些init()
方法,並將其傳遞給handle
。這在我的每個Window
派生的類中。 (LogWindow
,SearchWindow
,PreferencesWindow
等)
我正在尋找一種方法,以便能夠像做:
類LogWindow:公共窗口,公共SnappableWindow,公共MinimizableWindow
...並且不需要在LogWindow
內執行其他任何操作。我已經擺弄虛擬繼承,但無法完全解決這個問題。
也許你可以看看http://en.wikipedia.org/wiki/Aspect-oriented_programming – 2012-07-13 21:55:02
至少在Windows上,WTL已經非常類似於你似乎試圖做的事情。由於派生構造函數只在基類構造函數完成後運行*,因此在基類的構造函數中途初始化的句柄不應引起問題。 – 2012-07-13 22:01:08