为什么在多重继承的情况下QObject需要是第一个
Why QObject needs to be the first in case of multiple inheritance
根据 http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first 使用多重继承时,QObject
必须是基 类 中的第一个。
是因为moc
工具的一些限制还是考虑了C++的内存布局问题,所以才出现这个限制?
假设我们有一个 class Test
声明为:
class Test : public Foo, public QObject
{
Q_OBJECT
[..]
};
如果您查看 moc
工具生成的 moc_test.cpp
文件,您将看到如下内容:
[..]
const QMetaObject Command::staticMetaObject = {
{ &Foo::staticMetaObject, qt_meta_stringdata_Command,
qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]
编译器会抱怨 staticMetaObject
不是 Foo
的成员,因为 Foo
不是 QObject
。出于某种原因,moc
工具生成此代码采用 first 父 class。因此,如果您将 Test
声明为:
class Test : public QObject, public Foo {};
生成的代码对编译器来说看起来很好。
我认为这样做只是为了方便,因为 moc
工具在不解析整个层次结构的情况下很难知道哪个父 class 是 QObject
。
注意:如果您不使用Q_OBJECT
宏,您可以按任意顺序从其他人那里导出您的class。
根据 http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first 使用多重继承时,QObject
必须是基 类 中的第一个。
是因为moc
工具的一些限制还是考虑了C++的内存布局问题,所以才出现这个限制?
假设我们有一个 class Test
声明为:
class Test : public Foo, public QObject
{
Q_OBJECT
[..]
};
如果您查看 moc
工具生成的 moc_test.cpp
文件,您将看到如下内容:
[..]
const QMetaObject Command::staticMetaObject = {
{ &Foo::staticMetaObject, qt_meta_stringdata_Command,
qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]
编译器会抱怨 staticMetaObject
不是 Foo
的成员,因为 Foo
不是 QObject
。出于某种原因,moc
工具生成此代码采用 first 父 class。因此,如果您将 Test
声明为:
class Test : public QObject, public Foo {};
生成的代码对编译器来说看起来很好。
我认为这样做只是为了方便,因为 moc
工具在不解析整个层次结构的情况下很难知道哪个父 class 是 QObject
。
注意:如果您不使用Q_OBJECT
宏,您可以按任意顺序从其他人那里导出您的class。