C++ 为什么在多重继承的情况下QObject必须是第一个
根据C++ 为什么在多重继承的情况下QObject必须是第一个,c++,qt,inheritance,qobject,moc,C++,Qt,Inheritance,Qobject,Moc,根据QObject,当使用多重继承时,QObject必须是基类中的第一个 这是因为在代码中有一些限制吗?MOC < /C>工具还是C++内存布局问题也被考虑进去,因此这个限制就成立了吗?< /P> < P>假设我们有一个类测试< /CUL> >声明为: class Test : public Foo, public QObject { Q_OBJECT [..] }; 如果您查看moc工具生成的moc_test.cpp文件,您将看到如下内容: [..] const QMetaO
QObject,当使用多重继承时,QObject必须是基类中的第一个
这是因为在代码中有一些限制吗?MOC < /C>工具还是C++内存布局问题也被考虑进去,因此这个限制就成立了吗?< /P> < P>假设我们有一个类<代码>测试< /CUL> >声明为:
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\u对象
宏,您可以从其他对象以任何顺序派生类。我认为这不仅仅是方便,因为在派生类对象中,指向基类的指针将位于不同的位置(将具有不同的偏移量)。我认为qt做了一些愚蠢的石膏。