gpt4 book ai didi

c++ - 通过覆盖非虚方法子类化 QIODevice

转载 作者:行者123 更新时间:2023-11-28 01:58:23 25 4
gpt4 key购买 nike

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

我看到了:

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

在 QIODevice 接口(interface)中声明为虚拟的,但不是方法:

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 是纯虚拟的且 protected 。所以我假设 writeread 会在内部调用它们。

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

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

关于c++ - 通过覆盖非虚方法子类化 QIODevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com