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

标签 c++ qt multiple-inheritance

我了解到,一般来说,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/

相关文章:

java - 将接口(interface)连接到类成员

C++ iostreams问题

c++ - 如何修复 Mujoco CmakeLists 构建错误 "/usr/bin/ld: cannot find -lglfw"?

qt - QML 形状的拖动坐标

c++ - Qt 应用程序名称占位符

qt - 如何防止 QWebEngineView 将注意力集中在 setHtml(...) 和 load(...) 调用上?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 在类对象的 vector 中找到一个值

c++ - 减少多虚拟继承中对象的大小(浪费)

c++ - c++多重继承的理解