我想从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
?
否则,如果QIODevice
和write
不是虚拟的,我该如何创建自定义read
?
答案 0 :(得分:2)
这是通过设计完成的。如果写入和读取不是虚拟的,则不应覆盖它们。
readData
和writeData
是纯虚拟和受保护的。所以我认为write
和read
会在内部调用这些内容。
至于他们为什么不能被覆盖,你必须问问Qt设计师。它们很可能会修改一些私有的内部状态等,因此它必须包含在这些调用中。
通常Qt类设计得非常好,所以我假设您不需要首先覆盖write
和read
。如果你这样做,你的设计可能存在一些问题。