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

时间:2016-11-03 14:36:56

标签: c++ qt inheritance virtual-functions

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

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

1 个答案:

答案 0 :(得分:2)

这是通过设计完成的。如果写入和读取不是虚拟的,则不应覆盖它们。

readDatawriteData是纯虚拟和受保护的。所以我认为writeread会在内部调用这些内容。

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

通常Qt类设计得非常好,所以我假设您不需要首先覆盖writeread。如果你这样做,你的设计可能存在一些问题。