我了解到,一般来说,Qt 不支持 QObject
派生类的多重继承(甚至是虚拟多重继承)。
我理解的原因是(我认为)即使在虚拟继承的情况下,Qt 类它们自己实际上也不是从 QObject
继承的。例如,如果您尝试从 QWidget
和 QThread
中虚拟派生一个类,这会将虚拟继承置于继承链中不相关的位置,您仍然会结束有两个 QObject
实例。
因此,我认为在 Qt 中使用虚拟继承是安全的,并且在 Qt 中得到支持,其中唯一派生自 QObject
本身的 Qt 类。
我有:
class Top : public QObject {};
class Left : public virtual Top {};
class Right : public virtual Top {};
class Bottom : public Left, public Right {}; // Is this safe, and supported by Qt?
请注意 Bottom
的实例实际上只有一个 Top
的实例(因此只有一个 QObject
的实例),所以看起来Qt 中避免多重继承(甚至虚拟多重继承)的基本原理在这里不适用。
尽管如此,上述构造仍会导致 Qt 编译器发出警告 Class Bottom 继承自两个 QObject 子类 Left 和 Right。这是不支持的!
。
我说的对吗?在这种特定情况下忽略 Qt 编译器警告是否安全?上述构造,涉及直接来自 QObject 的虚拟多重继承,在 Qt 中是否安全且受支持?
最佳答案
不,Qt 不以任何方式支持 QObject
的多重继承。
问题不在于虚继承,而在于 Qt 的元对象系统。每个 QObject
基类都有一个关联的 QMetaObject
,它管理信号、槽、属性等,每个元对象都知道它的父 QObject
,例如可以处理存在于父类中的信号。 Qt moc 无法处理来自 QObject
或其任何子类的多重继承。
关于c++ - 如果直接从 QObject 派生,使用*虚拟*多重继承是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16445863/