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