QObject的多重继承

3

我有一个类,它会通过连接监听几个不同上下文中的信号,还有一个对话框会负责此监听以及其他一些事情。

class MyListener : public QObject
{
    Q_OBJECT
};

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

这导致了以下编译错误:

错误:对“connect”的引用不明确

我怀疑这可能是由于MyDialog通过QDialog和MyListener两次多重继承QObject所致。然而,将上述所有继承语句都改为虚拟的并没有消除错误。

您能否建议可能是什么原因呢?


你正在使用版本4.8还是5.1.1? - Syntactic Fructose
3个回答

4

让它变成:

class MyDialog : public QDialog
{
    Q_OBJECT

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

    private:
    MyListener m_listener;
};

2

您是否考虑将您的QObject作为受保护的继承?这是因为两个类在您的.ui文件中使用connect()函数将插槽和信号连接在一起,每个类相互继承意味着当程序调用连接您的信号/插槽时,现在有两个可能的连接函数。

将所需的函数设置为受保护,并防止两个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
};

1
将上述所有继承语句变为虚拟的并不能消除错误。这是可以预料的,因为"virtual"关键字只影响直接基类。也就是说,MyListener仍然以非虚拟方式继承QObject。你不能真正改变这一点。此外,文档中还指出:QObject不支持虚拟继承。唯一合理的解决方案是让MyListener不继承QObject。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接