Qt和C++:双重继承与组合

Qt and C++ : double inheritance vs composition?

本文关键字:继承 组合 C++ Qt      更新时间:2023-10-16

我的问题如下。我想制作一个新的小部件,它是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?)
Composition满足has-a关系(NewWidget有一个QTableWidget,NewWidget还有一个QMenuBar?)

不可能同时从两个QWidget继承。每个QWidget也是一个QObject。MOC(元对象编译器)无法处理此类。

继承-关系是X是Y

组成-关系是X具有Y

这就是你的答案——X和Y之间的关系是什么?