为啥在多重继承的情况下QObject需要是第一个
Posted
技术标签:
【中文标题】为啥在多重继承的情况下QObject需要是第一个【英文标题】:Why QObject needs to be the first in case of multiple inheritance为什么在多重继承的情况下QObject需要是第一个 【发布时间】: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++的内存布局问题也考虑到了,才产生了这个限制?
【问题讨论】:
【参考方案1】:假设我们有一个类 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
宏,您可以按任何顺序从其他类派生您的类。
【讨论】:
我认为这不仅仅是方便,因为在派生类对象中,指向基类的指针将位于不同的位置(会有不同的偏移量)。而且我认为 qt 做了一些愚蠢的演员表。以上是关于为啥在多重继承的情况下QObject需要是第一个的主要内容,如果未能解决你的问题,请参考以下文章