2012-04-14 95 views
0

我想要掌握C++中多重虛擬/非虛擬繼承的概念。如果我正確地理解,如果B類和C類實際上從類A繼承,它們共享一種單例對象,即它們都訪問一個公共對象A的相同字段。多重繼承將爲任何B和C對象創建單獨的A對象。C++中的虛擬與非虛擬多重繼承

考慮到上述因素,是否有人會如此善良,並將其呈現在簡單實用的環境中?爲什麼在多數繼承首先,然後爲什麼虛擬/非虛擬?

謝謝。

+0

你讀過關於C++編程的內容嗎?多重或虛擬繼承很棘手,經常應該避免。問題是從B和C繼承D類。 – 2012-04-14 16:27:10

+0

現在我正在研究它,我只有基本的介紹。如果有人能夠舉一個簡單的例子來說明你爲什麼要使用其中一個,那麼我肯定會變得更好。我不需要任何複雜/臨界的情況。基本的,典型的情景將是完美的,用一句話。 – Bober02 2012-04-14 16:33:40

+0

我很少必須使用多重繼承或虛擬繼承。一個好的規則是永遠不要使用它。 – 2012-04-14 16:48:12

回答

4

多繼承不經常used in C++。在大多數情況下,它是一個接口/實現的混合體。這也不是禁止的。需要(虛擬)多重繼承來自設計決定從一個普通的基類派生:

class Window 
{ /* draw, show, hide, background ... */ }; 

class WindowWithBorder : public virtual Window 
{ /* methods to manipulate/draw border ... */ }; 

class WindowWithMenu : public virtual Window 
{ /* methods to manipulate/draw Menu ... */ }; 

class MyWindow : public WindowWithBorder, public WindowWithMenu 
{ /* now it's your turn ... */ }; 

這些菱形的繼承圖必須由庫的實現可以預見。 沒有virtual將有兩個基地Window對象,與virtual它只是一個,但不是一個單身人士,因爲可以有很多窗口。

圖書館經常可以(但不是在所有情況下)avoid這樣的情況下,例如,通過實現具有「胖」基類的composite design pattern,通過實現抽象接口類或使用具有特徵/策略的模板。

我建議閱讀Bjarne Stroustrup的The C++ Programming language(我的第3版中的第15章,我借用了該示例)中的類層次結構一章。