gpt4 book ai didi

c++ - 如果直接从 QObject 派生,使用*虚拟*多重继承是否安全?

转载 作者:太空狗 更新时间:2023-10-29 21:24:20 26 4
gpt4 key购买 nike

我了解到,一般来说,Qt 不支持 QObject 派生类的多重继承(甚至是虚拟多重继承)。

我理解的原因是(我认为)即使在虚拟继承的情况下,Qt 类它们自己实际上也不是从 QObject 继承的。例如,如果您尝试从 QWidgetQThread 中虚拟派生一个类,这会将虚拟继承置于继承链中不相关的位置,您仍然会结束有两个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com