QObject的多重继承

时间:2013-11-06 17:30:01

标签: c++ qt multiple-inheritance

我有一个课程,可以通过连接几个不同的上下文中的某些信号进行收听,还有一个会说其他内容的对话。

class MyListener : public QObject
{
    Q_OBJECT
};

class MyDialog : public QDialog, public MyListener
{
    Q_OBJECT
};

导致以下编译错误:

错误:对'connect'的引用不明确

我怀疑这可能是由MyDialog多次继承QObject引起的,一次是通过QDialog引起的,一次是通过MyListener引起的。但是,将所有上述继承语句设置为虚拟并不能消除错误。

你能否说一下这可能是什么原因?

3 个答案:

答案 0 :(得分:3)

成功:

class MyDialog : public QDialog
{
    Q_OBJECT

    public:
    MyListener& listener() { return m_listener; }

    private:
    MyListener m_listener;
};

答案 1 :(得分:1)

您是否考虑过将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
};

答案 2 :(得分:1)

  

使所有上述继承语句虚拟化并没有消除错误。

这是预期的,因为virtual关键字仅影响直接基类。也就是说,MyListener仍然非虚拟地继承QObject。你无法真正改变它。

最重要的是,文档说

  

使用QObject的虚拟继承不支持

唯一合理的解决方案是让MyListener 继承QObject