从QObject类及非QObject类实现多继承,需把QObject放在继承链最前面

发布时间:2024年01月19日

在开发中,有时需要实现多继承,如下定义了一个抽象类作为接口:

// 接收CAN数据接口类

#ifndef _RECVCANDATA_INTERFACE_H
#define _RECVCANDATA_INTERFACE_H

#include"cansocketlinux.h"
class CRecvCanDataInterface
{

public: // virtual block
    virtual bool parseFrame(const CanFrame& frame) = 0;


};

#endif // _RECVCANDATA_INTERFACE_H

对于本博文代码,读者可不必关心CanFrame类,CanFrame类不影响本博文技术的阐述,如下定义?CRecvChargeCabinetCanData类:

#ifndef RECVCHARGECABINETCANDATA_H
#define RECVCHARGECABINETCANDATA_H
#include"recvCanDataInterface.h"
#include<QObject>

class CRecvChargeCabinetCanData : public CRecvCanDataInterface, public QObject
{
    Q_OBJECT
public:
    CRecvChargeCabinetCanData(QObject*pParent = nullptr);
    ~CRecvChargeCabinetCanData();

public: // virtual block
    virtual bool parseFrame(const CanFrame& frame) override;
};

#endif // RECVCHARGECABINETCANDATA_H

CRecvChargeCabinetCanData类重载了CRecvCanDataInterface接口的parseFrame函数,且派生自QObject,不幸的是,编译报如下错误:

解决上述错误的方法是:更改多继承父的顺序,将QOjbect放在第1父的位置,即改为如下那样:?

#ifndef RECVCHARGECABINETCANDATA_H
#define RECVCHARGECABINETCANDATA_H
#include"recvCanDataInterface.h"
#include<QObject>

class CRecvChargeCabinetCanData : public QObject, public CRecvCanDataInterface
{
    Q_OBJECT
public:
    CRecvChargeCabinetCanData(QObject*pParent = nullptr);
    ~CRecvChargeCabinetCanData();

public: // virtual block
    virtual bool parseFrame(const CanFrame& frame) override;
};

#endif // RECVCHARGECABINETCANDATA_H

在Qt自己实现的插件技术(如QPluginLoader、QSqlDriverPlugin、QIconEnginePlugin、QAccessiblePlugin、QStylePlugin)中,大量用到了这种多继承,具体可以参考:

Qt安装目录\Examples\Qt-X.YY.Z\widgets\tools\plugandpaint\plugins

目录下的Qt官方自带的例子,其中,X.YY.Z表示Qt的版本号,如:5.14.1

文章来源:https://blog.csdn.net/danshiming/article/details/135701158
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。