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

博客介绍开发中实现多继承时,定义了抽象类作为接口,以CRecvChargeCabinetCanData类为例,该类重载接口函数且派生自QObject,编译报错。解决方法是更改多继承父类顺序,将QObject放首位,还提及Qt插件技术大量用到多继承。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

// 接收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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值