【发布时间】:2023-03-27 16:02:01
【问题描述】:
我想从 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?
否则,如果write 和read 不是虚拟的,我该如何创建自定义QIODevice?
【问题讨论】:
-
你不能覆盖非虚拟方法,你只能隐藏它们,这无济于事。您必须覆盖 write_data,而不是写入(您不能这样做)。
-
@n.m.假设我只覆盖 writeData 方法。如果我在我的对象上调用 write 会发生什么?如果基类在其 write 方法上调用我的 writeData 实现,是否会调用它?
-
"如果基类在其 write 方法上调用我的 writeData 实现,是否会调用它?"是的,这就是 writeData 是虚拟的。
-
如果没有 Qt 的调试版本,您将无处可去。拥有它后,使用它来跟踪调用“QIODevice::read”或“write”时发生的情况。那你就明白了。真的。
标签: c++ qt inheritance virtual-functions