通过重写非虚方法子类化QIODevice
Subclassing QIODevice by overriding non-virtual methods
我想从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
?
这是由设计完成的。如果写和读不是虚拟的,则不打算重写它们。
readData
和writeData
是纯虚拟且受保护的。所以我假设write
和read
会在内部调用它们。
至于为什么它们不能被重写,你必须问Qt设计者。很有可能他们修改了一些内部状态等,这些状态是私有的,所以它必须被包装在那些调用中。
通常Qt类设计得很好,所以我认为你不应该首先覆盖write
和read
。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 重写QIODevice子类中的readData会返回错误的结果