使用带有继承的 Qt5 新连接语法

Using Qt5 new connect syntax with inheritance

我正尝试在一些遗留代码中使用新的连接语法,但遇到了体系结构问题。所以让我们假设我有一个 BaseReader class 看起来像这样:

class BaseReader : public QObject
{
  Q_OBJECT

  public:
    BaseReader();

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

那么假设我有一些 children class这样的

class Reader1 : public BaseReader
{
  Q_OBJECT

  public:
    BaseReader();

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

一些读取工作在 class 基地完成,一些在 child class 完成。我有大约 4 个 classes 在运行时切换。我有一个 connectReaders 函数,如下所示:

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

现在我的理解是,如果我使用新语法,我将连接到基本成员函数,而不是重载版本。那是对的吗 ?有没有办法在不修改架构的情况下使用新语法连接这些信号?我的示例非常简单,修改该代码需要几个月的时间(包括测试)。它以旧方式工作,但我想利用新语法。有什么想法吗?

我查看了这些线程,但它们似乎没有提供解决此问题的方法:

我有qt5.4.1,Visual Studio 2013.

将新的 'connect' 语法与虚拟槽和基本 class 对象指针一起使用时没有问题。您正在指定对象实例(例如 currentReader),要调用的具体方法将使用此对象的虚方法 table.

解析

免责声明:我不熟悉Qt。然而,这里的问题似乎是一个 C++ 问题。

当在基 class 中使用指向虚函数的成员指针时,在 pointer/reference 到派生 class 上,派生 class 中的重写=] 将被调用(如果它存在)。

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 信号使用派生对象调用您的成员函数指针,函数覆盖将因此被调用。