Fer*_*eak 5 c++ inheritance qt moc qobject
根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first的QObject规定,使用多重继承时,基类必须是第一个。
这是因为moc工具的某些限制还是C ++内存布局问题也被考虑在内,因此这种限制就已经存在了吗?
假设我们有一个Test声明为的类:
class Test : public Foo, public QObject
{
Q_OBJECT
[..]
};
Run Code Online (Sandbox Code Playgroud)
如果查看moc_test.cpp该moc工具生成的文件,将会看到类似以下内容的内容:
[..]
const QMetaObject Command::staticMetaObject = {
{ &Foo::staticMetaObject, qt_meta_stringdata_Command,
qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨自己staticMetaObject不能成为成员Foo,而Foo不是QObject。由于某种原因,该moc工具使用第一个父类生成此代码。因此,如果您声明Test为:
class Test : public QObject, public Foo {};
Run Code Online (Sandbox Code Playgroud)
生成的代码对编译器来说看起来不错。
我认为这样做只是为了方便,因为moc在QObject不解析整个层次结构的情况下,工具很难知道哪个父类是父类。
注意:如果不使用Q_OBJECT宏,则可以按任何顺序从其他类派生您的类。