通过覆盖非虚方法子类化 QIODevice

Subclassing QIODevice by overriding non-virtual methods

我想从 QIODevice 子class,因为我正在创建我的自定义设备(自定义串行端口对象)。

我看到了:

writeData(const char *, qint64 ) : qint64
readData(char *, qint64 ) : qint64

在 QIODevice 接口中声明为虚拟的,但不是方法:

read(char *, qint64 ) : qint64
write(const char *, qint64 ) : qint64

然后在我的项目中我有一个串口管理器class像这样:

class SerialPortManager{
public:
    SerialPortManager(int type){
         if (type == 1)
             genericSerialPort = new QSerialPort(); //QT framework
         else if (type == 2)
             genericSerialPort = new MySerialPort(); //my custom object, derived from QIODevice
    }

    qint64 write(char * data, qint64 size)
    {
        genericSerialPort->write(data, size);
    }    

private:
    QIODevice* genericSerialPort = 0;
};

我的自定义串口(MySerialPort.h)定义如下:

class MySerialPort : public QIODevice{
    Q_OBJECT
    public:
        explicit MySerialPort(QObject *parent = Q_NULLPTR);
        virtual ~MySerialPort();

        qint64 readData(char *data, qint64 maxSize);
        qint64 writeData(const char *data, qint64 maxSize);

        qint64 write(char * data, qint64 size);

        ...
    };

这里发生的事情是,如果我创建一个类型 1 的 SerialPortManager 对象(QSerialPort 实例)并在其上调用 write,则 write 函数QSerialPort 被调用。 相反,如果我创建类型 2 的 SerialPortManager 对象(MySerialPort 实例)并在其上调用 write,我不会调用 write 函数。

那么,是否可以覆盖QIODevice的非虚方法write? 否则,如果 writeread 不是虚拟的,我如何创建自定义 QIODevice

这是设计使然。如果写入和读取不是虚拟的,则不应覆盖它们。

readDatawriteData 是纯虚拟和受保护的。所以我假设 writeread 会在内部调用它们。

至于为什么它们不可重写你得问Qt设计师。他们很可能会修改一些私有的内部状态等,因此必须将其包装在这些调用中。

通常 Qt 类 设计得很好,所以我认为您首先不需要覆盖 writeread。如果你这样做,你的设计可能有问题。