#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

@目录[Qt开发探幽]QObject、模板继承多继承1. QObject为什么不允许模板继承:2.如果要使用QObject进行多继承的话,子对象引用的父至多只能含有一个QObject3.如果使用模板和QObject多继承,编译不通过问题场景[Qt开发探幽]QObject、模板继承多继承 当我们在用Qt开发一个软件框架的时候,在一个正式一点的库或者框架中,我们不可避免地想要使用继承,... 任何继承QThread的线程都是通过继承 QThread 的run函数来实现多线程的,因此,必须重写QThread的run函数,把复杂逻辑写在QThread的run函数中。然后在主线程中调用 start() 函数来启动子线程。子QThread 的方法,就是重写了 QThread 中的 run() 函数,在 run() 函数中定义要的工作。这样的结果是,我们自定义的子线程调用 start() 函数后,便开始执行 run() 函数。 由于QObject,我在QT中遇到了关于多重继承的问题。我知道很多其他人也有同样的问题,但我不知道该如何解决。Qt多重继承和信号class NavigatableItem : public QObject{Q_OBJECTsignals:void deselected();void selected();void activated();};class Button : public Naviga... I am trying to use mix in classes for C++/Qt to provide a whole bunch of widgets with a common interface. The interface is defined in such as way so that if it is defined as the base class for other w... 在前面的例子中,派生都只有一个基,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生可以有两个或多个基多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承多继承的语法也很简单,将多个基用逗号隔开即可。例如已声明了A、B和C,...