簡體   English   中英

QObject的多重繼承

[英]Multiple inheritance of QObject

我有一個可以在幾個不同上下文中通過連接到某些信號進行偵聽的類,以及一個可以進行偵聽的對話框。

class MyListener : public QObject
{
    Q_OBJECT
};

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

這導致以下編譯錯誤:

錯誤:對“連接”的引用不明確

我懷疑這可能是由於MyDialog對QObject的多重繼承所致,一次是通過QDialog,一次是通過MyListener。 但是,將所有上述繼承語句設為虛擬並不能消除該錯誤。

你能建議這是什么原因嗎?

做了:

class MyDialog : public QDialog
{
    Q_OBJECT

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

    private:
    MyListener m_listener;
};

您是否考慮過將QObject繼承為受保護對象? 這是因為兩個類都使用connect()函數將.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
};

將所有上述繼承語句設為虛擬並不能消除該錯誤。

這是預期的,因為virtual關鍵字僅影響直接基類。 也就是說, MyListener仍然非虛擬地繼承QObject 您無法真正改變它。

最重要的是,文檔說

支持使用QObject進行虛擬繼承。

唯一合理的解決方案是讓MyListener 繼承QObject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM