对于本博文代码,读者可不必关心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,...
在Qt自己实现的插件技术(如QPluginLoader、QSqlDriverPlugin、QIconEnginePlugin、QAccessiblePlugin、QStylePlugin)中,大量用到了这种多继承,具体可以参考:
Qt安装目录\Examples\Qt-X.YY.Z\widgets\tools\plugandpaint\plugins
目录下的Qt官方自带的例子,其中,X.YY.Z表示Qt的版本号,如:5.14.1