【问题标题】:Multiple inheritance of QObjectQObject的多重继承
【发布时间】:2013-11-06 17:30:01
【问题描述】:
我有一个类可以通过连接到几个不同上下文中的某些信号来监听,还有一个对话框可以进行上述监听。
class MyListener : public QObject
{
Q_OBJECT
};
class MyDialog : public QDialog, public MyListener
{
Q_OBJECT
};
导致以下编译错误:
错误:对“连接”的引用不明确
我怀疑这可能是由MyDialog对QObject的多重继承引起的,一次通过QDialog,一次通过MyListener。但是,将上述所有继承语句都设为虚拟并不能消除错误。
您能建议这可能是什么原因吗?
【问题讨论】:
标签:
c++
qt
multiple-inheritance
【解决方案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。