3
根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-firstQObject
在使用多重继承时必须是基类中的第一个。为什么QObject需要成为多继承情况下的第一个
这是由于moc
工具中的某些限制,或者C++内存布局问题也被考虑到了,因此这个限制是否存在?
根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-firstQObject
在使用多重继承时必须是基类中的第一个。为什么QObject需要成为多继承情况下的第一个
这是由于moc
工具中的某些限制,或者C++内存布局问题也被考虑到了,因此这个限制是否存在?
假设我们有一个类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
工具会生成此代码,其中为第一个父类。因此,如果你声明Test
为:
class Test : public QObject, public Foo {};
生成的代码对编译器来说看起来很好。
我认为这只是为了方便,因为moc
工具几乎不知道哪个父类是QObject
而没有解析整个层次结构。
注意:如果您不使用Q_OBJECT
宏,您可以按任何顺序从其他人派生您的班级。
我认为这不仅是便利,因为在派生类对象内,指向基类的指针将位于不同的位置(将具有不同的偏移量)。我认为qt做了一些愚蠢的演员。 – 2015-02-24 13:10:03