QT多重继承的时候,要把QObject放在最前面,否则报错——C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样

时间:2021-02-14 21:59:10

在买来的控件(没有源码)的基础上,想加入QObject的一些特性,不得不多继承:

class MyProgress : public CProgress, public QObject

但总是报错:

release\moc_my_tool.cpp:80:12: error: 'qt_metacast' is not a member of 'CProgress'
return CProgress::qt_metacast(_clname);

清除临时文件,重新编译几次后,仍是如此,心想难道QT不支持别的类库基础上的多继承?

后来灵机一动,可能要把QObject写在最前面,这样Q_OBJECT宏才会立刻展开,并应用于后续的继承类,所以改成这样:

class MyProgress : public QObject, public CProgress

这时候再编译就行了。

不知道是有意,还是无意,QWidget也是先继承QObject,然后再继承QPaintDevice的。

------------------------------------------------------------------

另外值得注意的是,继承的时候,要分别写上两个public(唉,C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样),否则也会报错,即QObject的一些功能不能用于CProgress(比如connect功能)。