通过重写非虚方法子类化QIODevice

Subclassing QIODevice by overriding non-virtual methods

本文关键字:子类 QIODevice 方法 重写      更新时间:2023-10-16

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

我看到了:

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

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

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

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

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,则调用QSerialPort上的write函数。相反,如果我创建类型2的SerialPortManager对象(MySerialPort实例)并在其上调用write,则不会调用write函数。

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

这是由设计完成的。如果写和读不是虚拟的,则不打算重写它们。

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

至于为什么它们不能被重写,你必须问Qt设计者。很有可能他们修改了一些内部状态等,这些状态是私有的,所以它必须被包装在那些调用中。

通常Qt类设计得很好,所以我认为你不应该首先覆盖writeread