Qt多重继承出错了

时间:2015-08-20 12:54:13

标签: c++ qt inheritance multiple-inheritance

我的一个项目,用Qt编写,我有一个QWidget Widget,应显示MyTreeWidget(继承自QTreeWidget)或MyTableWidget(继承自QTableWidget

约束

  • Widget不应该知道与谁交谈。因此它必须(??)拥有由My(Tree|Table)Widget
  • 继承的类
  • MyTreeWidgetMyTableWidget分享了大量代码,我不想复制粘贴此代码。所以我想让它们继承自MyGenericView继承自QAbstractItemView
  • #include <QAbstractItemView> #include <QTreeWidget> #include <QTableWidget> class MyGenericView : public QAbstractItemView { Q_OBJECT public: MyGenericView(); }; class MyTreeWidget : virtual public QTreeWidget, virtual public MyGenericView { Q_OBJECT public: explicit MyTreeWidget(QWidget *parent = 0); }; class MyTableWidget : public MyGenericView, public QTableWidget { ... }; class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0) : QWidget(parent) { m_genericView = new MyTreeWidget(); } private: MyGenericView *m_genericView; };

接口

erreur : invalid new-expression of abstract class type 'MyTableWidget'
m_genericView = new MyTableWidget();

note:   because the following virtual functions are pure within 'MyTableWidget':
class MyTableWidget : public QTableWidget, public MyGenericView

错误

chcp 1252

MyTreeWidget也一样。

那你怎么纠正这个?

2 个答案:

答案 0 :(得分:1)

你似乎想要做的事情是不明智的。您从中获得的两种视图都是便利视图。他们无可救药地将视图与模型混为一谈。如果需求很简单且方便就是你之后的事情,可以使用它们,但在你的情况下,我认为大部分共享代码都与模型方面有关,而与视图无关。只需在库存QStandardItemModel或库存QTableView上显示QTreeView,并拥有一个使用QStandardItemModel来构建您的{{1}}的类,您就可以实现您的目标。数据结构。

有关如何执行此操作的详细信息,如果结果是正确的,请参阅this answer

答案 1 :(得分:-1)

编辑:正如下面评论中所建议的那样,这个答案是基于错误的假设。请看下面更好的答案。

首先,您有钻石继承问题。您的错误是因为MyTableWidget具有未定义的纯虚拟成员函数。

但是坦率地说,我不确定你为什么要在这里使用多重继承。如果要节省代码重复,为什么MyTreeWidget和MyTableWidget不能通过合成而不是继承来共享行为元素?这绝对是a-a vs has-a的情况吗?如果它的代码特定于共享但不以任何方式与QTableWidget / QTreeWidget方法重叠的小部件,那么只需编写一个将填充Tree或Table小部件的适配器类。