5

QObject一般に、派生クラスからの多重継承 (仮想多重継承であっても) は Qt ではサポートされていないことを理解しています。

仮想継承の場合でも、Qtクラス自体は仮想継承しないという理由を理解しています(私はそう思います) QObject。たとえば、 と の両方から仮想的にクラスを派生させようとするQWidgetQThread、継承チェーンの無関係な場所に仮想継承が配置され、2 つのQObjectインスタンスが作成されます。

したがって、派生元の唯一の 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真に のインスタンスを 1 つしか持たないTop(したがってのインスタンスを 1 つだけ持つ) ため、Qt での多重継承 (仮想QObject多重継承であっても) を回避する論理的根拠はここでは当てはまらないようです。

それにもかかわらず、上記の構成により、Qt コンパイラの警告が発生しClass Bottom inherits from two QObject subclasses Left and Right. This is not supported!ます。

私は正しいですか?この特定のシナリオで Qt コンパイラの警告を無視しても安全ですか? QObjectから直接仮想多重継承を含む上記の構造は、安全でQtでサポートされていますか?

4

1 に答える 1

4

いいえ、からの多重継承QObjectは Qt ではサポートされていません。

問題は仮想継承ではなく、Qt のメタオブジェクト システムです。各QObject基本クラスには、QMetaObjectシグナル、スロット、プロパティなどを管理する関連付けがあり、各メタオブジェクトはその親を認識しているQObjectため、たとえば親クラスに存在するシグナルを処理できます。QObjectQt moc は、またはそのサブクラスからの複数の継承を処理できません。

于 2013-05-08T17:06:19.840 に答える