簡體   English   中英

C ++中的虛擬與非虛擬多重繼承

[英]virtual vs non-virtual multiple inheritance in c++

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

綜上所述,有誰會這么友善並以簡單,實際的方式提出建議? 為什么首先要多重繼承,然后為什么要虛擬/非虛擬?

謝謝。

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的只有一個,而不是一個單例,因為可以有很多窗口。

庫通常(但並非在每種情況下)都可以避免這種情況,例如,通過實現復合設計模式 ,具有“胖”基類,通過實現抽象接口類或通過使用具有特征/策略的模板。

我建議閱讀Bjarne Stroustrup的C ++編程語言中的類層次結構一章(第3版的第15章,從中借用了示例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM