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

时间:2012-07-21 03:01:00

标签: c++ qt inheritance

我的问题如下。我想创建一个新的小部件,它是QTableWidget + a QMenuBar(具有QTableWidget的特定配置)。目前,我创建了一个源自QWidget的MyWidget,其中包含QTableWidget + a QMenuBar。但是可以通过从MyWidgetQTableWidget派生QMenuBar来做同样的事情吗?如果可能的构造函数是什么样的?

4 个答案:

答案 0 :(得分:5)

由于QTableWidget和QMenuBar都继承自QWidget,我强烈建议不要使用双继承。例如,请参阅this question

目前你所做的事情通常被认为是“正确的”方式,至少在Qt中是这样。我怀疑你想要使用多重继承而不是组合的主要原因是你可能觉得你必须编写一堆函数,以便使用你的小部件的人可以,例如,添加到QMenuBar。这样的功能可能如下所示:

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

对我来说这有点傻,而我建议只为你的QMenuBar制作一个访问函数:

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

现在有人使用你的班级可以做

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

这种编码风格在Qt源代码中很常见,我认为它更清晰。

答案 1 :(得分:1)

这听起来像是适合你的需要。

继承满足is-a关系(NewWidget是QTableWidget,NewWidget是QMenuBar?)
组合满足has-a关系(NewWidget有一个QTableWidget,NewWidget有一个QMenuBar?)

答案 2 :(得分:1)

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

答案 3 :(得分:0)

继承 - 关系是X isa Y

组合 - 关系是X有一个Y

你有答案 - X和Y之间的关系是什么?