2014-03-27 31 views
2

我有多個QObject子類,它們應該作爲接口類來實現(由其他類繼承)。例如,讓class A : virtual public QObjectclass B : virtual public QObject爲接口類。我需要一個QDialog對象來實現它們的行爲,如:class X: public QDialog, A, B通過QObject子類實現多重繼承的最接近的解決方案

不幸的是我沒有仔細在設計時閱讀文檔,現在我才明白了兩個事實:

  1. 實施插槽,純虛成員函數是不可能的,因爲MOC生成的代碼將需要給他們打電話。
  2. QObject派生類不支持多繼承。這不是鑽石。這是因爲moc生成的代碼不能通過虛擬基地static_cast虛擬QObject對象到A*。 (這就是編譯器說的!)

什麼是最好的可能替代設計,儘可能影響代碼?我可以想到宏觀黑客。也許一個宏基類(如Q_OBJECT)將基地的所有成員,信號,插槽複製到派生類?

注意這真的不好說QObject s不能被繼承多次。是不是?

回答

2

如果你真的需要通過你的AB類暴露QObject成員函數創建一個抽象基類(即只有純虛函數的類),說AbstractQObject,並重新申報有你需要的QObject成員函數揭露。

ABAbstractQObjectXQDialogAB幾乎派生。

這應該可以解決你所描述的問題,但我懷疑你最好重新設計你的代碼。

+0

不,這不關乎'QObject'成員。 'A'和'B'使用信號和插槽,所以需要在類中繼承'QObject'並聲明'Q_OBJECT'宏。例如'A'有一個'QFutureWatcher'對象,它運行一個線程,並將它的'finished'信號連接到''A's槽中的一個。 –

+0

那麼恐怕你唯一的選擇是嘗試和重組你的代碼,以便使用組合和委派而不是繼承 –

+0

是的。這將打破很多過早的設計人員...... –