【问题标题】: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。但是,将上述所有继承语句都设为虚拟并不能消除错误。

您能建议这可能是什么原因吗?

【问题讨论】:

  • 您使用的是 4.8 版还是 5.1.1 版?

标签: 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

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        相关资源
        最近更新 更多