簡體   English   中英

Qt和C ++:雙重繼承與合成?

[英]Qt and C++ : double inheritance vs composition?

我的問題如下。 我想制作一個新的小部件,它是QTableWidget + QMenuBar (具有QTableWidget的特定配置)。 當前,我已經創建了一個MyWidget,它是從QWidget派生的,並包含QTableWidget + QMenuBar 但是是否可以通過從QTableWidgetQMenuBar派生MyWidget來做同樣的事情? 如果可能的話,構造函數是什么樣子?

由於QTableWidget和QMenuBar都從QWidget繼承,因此我強烈建議不要使用雙重繼承。 參見例如這個問題

至少在Qt中,您當前所做的事情通常被認為是“正確”的方法。 我懷疑要使用多重繼承而不是合成的主要原因是,您可能會覺得自己不得不編寫一堆函數,以便使使用小部件的人可以將其添加到QMenuBar中。 這樣的功能可能看起來像這樣:

QAction *MyWidget::addMenuToMyQMenuBar(QMenu *menu)
{
    return myMenu->addMenu(menu);
}

對我來說,這有點愚蠢,我建議您簡單地為您的QMenuBar制作一個訪問器函數:

QMenuBar *MyWidget::menuBar()
{
    return myMenu;
}

現在有人在使用您的課程就可以

myWidget->menu()->addAction(someAction);

這種編碼風格在Qt源代碼中很常見,我認為它更簡潔。

聽起來構圖會滿足您的需求。

繼承滿足is-a關系(NewWidget是QTableWidget,NewWidget是QMenuBar嗎?)
組合滿足has-a關系(NewWidget具有QTableWidget,NewWidget具有QMenuBar?)

不可能一次繼承兩個QWidget。 每個QWidget也是一個QObject。 MOC(元對象編譯器)無法處理此類。

繼承-關系是X isa Y

組成-關系是X具有Y

您有答案-X和Y之間是什么關系?

暫無
暫無

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

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