QObject的多重继承
Posted
技术标签:
【中文标题】QObject的多重继承【英文标题】:Multiple inheritance of QObject 【发布时间】:2013-11-06 17:30:01 【问题描述】:我有一个类可以通过连接到几个不同上下文中的某些信号来监听,还有一个对话框可以进行上述监听。
class MyListener : public QObject
Q_OBJECT
;
class MyDialog : public QDialog, public MyListener
Q_OBJECT
;
导致以下编译错误:
错误:对“连接”的引用不明确
我怀疑这可能是由MyDialog对引起的,一次通过QDialog,一次通过MyListener。但是,将上述所有继承语句都设为虚拟并不能消除错误。
您能建议这可能是什么原因吗?
【问题讨论】:
您使用的是 4.8 版还是 5.1.1 版? 【参考方案1】:制作:
class MyDialog : public QDialog
Q_OBJECT
public:
MyListener& listener() return m_listener;
private:
MyListener m_listener;
;
【讨论】:
【参考方案2】:您是否考虑过将 QObject
继承为受保护的?这是因为这两个类都使用 connect()
函数将 .ui 文件中的插槽和信号连接在一起,让每个类相互继承意味着您现在有两个可能的连接函数,只要程序调用连接您的信号/插槽
保护你需要的函数,防止两个connect()
的歧义
class MyListener
public:
//...
protected:
int a;
//stuff to share
;
class MyDialog: public QDialog, protected MyListener
//has access to all protected members but not the private members
;
【讨论】:
【参考方案3】:将上述所有继承语句设为虚拟并不能消除错误。
这是意料之中的,因为virtual
关键字只影响直接基类。也就是说,MyListener
仍然以非虚拟方式继承 QObject
。你无法真正改变这一点。
最重要的是,文档说
不支持使用 QObject 的虚拟继承。
唯一合理的解决方案是让MyListener
不继承QObject
。
【讨论】:
以上是关于QObject的多重继承的主要内容,如果未能解决你的问题,请参考以下文章