2
我有多個QObject子類,它們應該作爲接口類來實現(由其他類繼承)。例如,讓class A : virtual public QObject
和class B : virtual public QObject
爲接口類。我需要一個QDialog
對象來實現它們的行爲,如:class X: public QDialog, A, B
。通過QObject子類實現多重繼承的最接近的解決方案
不幸的是我沒有仔細在設計時閱讀文檔,現在我才明白了兩個事實:
- 實施插槽,純虛成員函數是不可能的,因爲MOC生成的代碼將需要給他們打電話。
- QObject派生類不支持多繼承。這不是鑽石。這是因爲moc生成的代碼不能通過虛擬基地
static_cast
虛擬QObject
對象到A*
。 (這就是編譯器說的!)
什麼是最好的可能替代設計,儘可能影響代碼?我可以想到宏觀黑客。也許一個宏基類(如Q_OBJECT
)將基地的所有成員,信號,插槽複製到派生類?
注意這真的不好說QObject
s不能被繼承多次。是不是?
不,這不關乎'QObject'成員。 'A'和'B'使用信號和插槽,所以需要在類中繼承'QObject'並聲明'Q_OBJECT'宏。例如'A'有一個'QFutureWatcher'對象,它運行一個線程,並將它的'finished'信號連接到''A's槽中的一個。 –
那麼恐怕你唯一的選擇是嘗試和重組你的代碼,以便使用組合和委派而不是繼承 –
是的。這將打破很多過早的設計人員...... –