2013-08-28 76 views
1

雖然我使用MFC,但我相信這主要是一個C++問題。如何在具有相同父項的兩個類之間共享代碼?

我有CResizingDialog派生自CDialog,它是應用程序中所有對話框的基類。它使他們能夠根據目標屏幕大小自動調整大小(你猜對了)。 CResizingDialog通過覆蓋CDialog的幾個虛函數來實現這一點,包括OnSize(),OnInitDialog(),OnPaint()。到目前爲止,很好,很好。

現在我添加一個屬性表/頁面,它也需要相同的調整大小功能,但是我不能使用CResizingDialog作爲我的屬性頁面的基類。這意味着我將需要一個新的基類,比如從CPropertyPage派生的CResizingPage,它將包含與CResizingDialog相同的功能。

但是,調整對話框及其控件的代碼完全相同。有什麼辦法可以重用CResizingDialog嗎?我從來沒有使用多重繼承,這會有幫助嗎?

+1

如果您想重新使用調整大小的代碼,您必須從CResizingDialog中提取調整大小的代碼並在對話框/屬性頁面實現中重用。多繼承不會在這裏幫助,主要是由於MFC的管道宏。 – IInspectable

+1

研究裝飾設計模式。 – imreal

+0

我不是MFC,所以如果這只是C++而已。 C++支持多重繼承。我有一個我正在使用的系統:想象一下A類,B類:public A和class C:public A.如果B可調整大小且C可調焦,則可以創建派生類D:public B,public C從B和C.爲什麼不繼承可調整大小? – Chemistpp

回答

2

我有2條建議如何解決這個問題,你必須決定哪一個更容易/更好地適合你的情況。

如果可能的話,您可以將調整大小的代碼移動到一個獨立的函數中,並使用您可以從2個虛擬函數調用的適當參數。

另一種方法是使基類成爲模板。例如:

template< typename Base > 
CResizingBase 
    : public Base 
{ 
    // override the appropriate functions here 
}; 

class CResizingDialog 
    : public CResizingBase<CDialog> 
{ 
}; 

class CResizingPage 
    : public CResizingBase<CPropertyPage> 
{ 
}; 
+0

看起來很有前途,但有一招是我有CDialog >> CResizingDialog >> CMyDialog。但是,這適合一個屬性頁面? CDialog >> CPropertypPage >> ?? >> CMyPage? – zar

+0

我從來沒有使用MFC,所以我不熟悉類結構。但是不會CDialog >> CPropertyPage >> CResizingPage >> CMyPage的工作? –

+0

這將是唯一合乎邏輯的方式,雖然我也在考慮CDialog >> CResizingDialog,但是CPropertyPage是一個庫類,我無法更改其基類。似乎值得一試。我實際上也必須爲CPropertySheet做同樣的事情,也是從CWnd派生的。 – zar

相關問題