在开发中,有时需要实现多继承,如下定义了一个抽象类作为接口:
// 接收CAN数据接口类#ifndef _RECVCANDATA_INTERFACE_H
#define _RECVCANDATA_INTERFACE_H#include"cansocketlinux.h"
class CRecvCanDataInterface
{public: // virtual blockvirtual 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 blockvirtual 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 blockvirtual 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