【发布时间】:2015-02-24 12:00:59
【问题描述】:
根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-firstQObject在使用多重继承时必须是基类中的第一个。
这是因为moc工具的一些限制还是C++的内存布局问题也考虑到了,才产生了这个限制?
【问题讨论】:
标签: c++ qt inheritance qobject moc
根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-firstQObject在使用多重继承时必须是基类中的第一个。
这是因为moc工具的一些限制还是C++的内存布局问题也考虑到了,才产生了这个限制?
【问题讨论】:
标签: c++ qt inheritance qobject moc
假设我们有一个类 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 父类生成此代码。因此,如果您将Test 声明为:
class Test : public QObject, public Foo {};
生成的代码在编译器中看起来不错。
我认为这样做只是为了方便,因为moc 工具在不解析整个层次结构的情况下很难知道哪个父类是QObject。
注意:如果您不使用Q_OBJECT 宏,您可以按任何顺序从其他类派生您的类。
【讨论】: