c++ - 为什么在多重继承的情况下QObject需要是第一个

标签 c++ qt inheritance qobject moc

根据 http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first使用多重继承时,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 工具生成此代码采用 first 父类。因此,如果您将 Test 声明为:

class Test : public QObject, public Foo {};

生成的代码对于编译器来说看起来很好。

我认为这样做只是为了方便,因为 moc 工具在不解析整个层次结构的情况下很难知道哪个父类是 QObject

注意:如果您不使用 Q_OBJECT 宏,您可以按任何顺序从其他人派生您的类。

关于c++ - 为什么在多重继承的情况下QObject需要是第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695282/

相关文章:

c++ - Lzz (Lazy C++) - #include 文件未找到

c++ - 如何在 Mac Os 上按名称获取进程?

c++ - 具有私有(private)成员的普通旧数据类型?

c++ - 如何设置 Xcode 来代替 Qt Creator 工作?

Java 错误 : Implicit super constructor is undefined for default constructor

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

c++ - 将内存中的 sqlite 数据库转换为 blob/char 数组

python - 如何防止 QTableView 项在双击时被清除

c++ - Qt C++ : Connect call fails in header in dynamic library

javascript - JavaScript 如何维护原型(prototype)引用?