在开发中,有时需要实现多继承,如下定义了一个抽象类作为接口:
// 接收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