簡體   English   中英

使用帶有繼承的Qt5新連接語法

[英]Using Qt5 new connect syntax with inheritance

我試圖在一些舊代碼中使用新的connect語法,但是遇到了體系結構問題。 因此,讓我們假設我有一個類似下面的BaseReader類:

class BaseReader : public QObject
{
  Q_OBJECT

  public:
    BaseReader();

  public slots:
    virtual void read(const fstream& myStream);
}

然后說我有一些這樣的孩子班

class Reader1 : public BaseReader
{
  Q_OBJECT

  public:
    BaseReader();

  public slots:
    virtual void read(const fstream& myStream);
}

有些讀取工作是在基類中完成的,有些是在子類中完成的。 我有大約4個在運行時切換的類。 我有一個connectReaders函數,看起來像這樣:

void connectReaders(BaseReader* currentReader)
{
  connect(this, SIGNAL(mustRead(const fstream&)), currentReader, SLOT(read(const fstream&)));
}

現在,我的理解是,如果使用新語法,則將連接到基本成員函數,而不連接任何重載版本。 那是對的嗎 ? 有什么方法可以使用新語法連接這些信號而無需修改體系結構? 我的示例非常簡化,修改該代碼將需要幾個月(包括測試)。 它以舊的方式工作,但是我想利用新的語法。 有任何想法嗎 ?

我看過這些線程,但它們似乎並未提供解決此問題的方法:

我有qt5.4.1,Visual Studio 2013。

新語法沒有問題。 您正在指定對象實例(例如currentReader ),將使用該對象的虛擬方法表來解析要調用的特定方法。

免責聲明:我對Qt不熟悉。 但是,這里的問題似乎是C ++問題。

在基類中使用指向虛擬函數的成員指針時,在對派生類的指針/引用上,將調用派生類中的重寫(如果存在)。

class Base
{
public:
    virtual void f()
    {
        std::cout << "Base\n";
    }
};

class Derived : public Base
{
public:
    virtual void f()
    {
        std::cout << "Derived\n";
    }
};

int main()
{
    void (Base::* pmf)() = &Base::f;
    Derived d;
    (d.*pmf)();
}

將打印“ Derived”,而不是“ Base”;

如果Qt信號使用派生對象調用成員函數指針,則將調用函數重寫。

暫無
暫無

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

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