Qt和C++:双重继承与组合
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?)
Composition满足has-a
关系(NewWidget有一个QTableWidget,NewWidget还有一个QMenuBar?)
不可能同时从两个QWidget继承。每个QWidget也是一个QObject。MOC(元对象编译器)无法处理此类。
继承-关系是X是Y
组成-关系是X具有Y
这就是你的答案——X和Y之间的关系是什么?
相关文章:
- 混合组合和继承的C++问题
- C++基于策略的设计:继承与组合
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- vector_base继承与组合
- 如何在 c++ 中将多重继承与组合一起使用?
- 是否可以使用 Gtk::D rawingArea (GTKmm) 作为组合而不是继承?
- C++:树根应该使用继承而不是组合吗?
- 必要时违反组合而不是继承可以吗?
- 避免使用组合进行额外的堆分配(过度继承)
- 为什么我在使用组合而不是继承时得到 C4624(无法访问基类析构函数)
- 编译器如何在继承C++中进行组合
- 类继承/组合设计
- Qt和C++:双重继承与组合
- 使用组合而不是继承的方法转发(使用C++特性)
- 将继承更改为组合
- C++中组合关系的继承
- 为什么与组合相比,私有继承会增加有人破坏我的代码的概率
- 两个接口,多个继承组合成一个容器
- 运算符<<和继承/组合
- c++中创建多继承组合类的设计指南