[英]Qt and C++ : double inheritance vs composition?
我的問題如下。 我想制作一個新的小部件,它是QTableWidget
+ QMenuBar
(具有QTableWidget
的特定配置)。 當前,我已經創建了一個MyWidget,它是從QWidget
派生的,並包含QTableWidget
+ QMenuBar
。 但是是否可以通過從QTableWidget
和QMenuBar
派生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.