1. 程式人生 > >Qt框架淺析之四 ------ 介面單繼承QWidget

Qt框架淺析之四 ------ 介面單繼承QWidget

    其實大家可以觀察一下QWidgets模組的繼承樹,還有其他Qt的模組,幾乎沒有多繼承,QWidget本身是多繼承QObject和QPaintEngine,QAxWidget為了實現ActiveX控制元件在Qt中的嵌入,多繼承了QAxBase和QWidget,其他跨模組的一些類也有一些是多繼承,但是在單個模組之下,比如QWidget及其子類QAbstractButton等,都是單繼承的關係(可以看最下面的繼承圖解,這是基於5.4.1mingw的版本的繼承樹)。為啥Qt選擇用單繼承實現?(在這裡不止Qt,其他一些常用的介面庫:duilib還有很多C++的三方庫都是單繼承。甚至現在的Java類只允許單繼承,介面之間可以用多繼承)

  • C++多繼承和單繼承

    在講這個問題之前,我們先來看看C++多繼承的問題。舉一個很典型的例子:C++的鑽石繼承(或稱菱形繼承),這在多執行緒之中是極為常見的問題,A派生B,C;D繼承自B,C。

    假設A不是虛基類,那麼在訪問A方法的時候會碰到二義性,會出現同一控制元件代表其有對應兩份基類QWidget。這種情況明顯不合適介面開發(因為這樣的話,最後的顯示到底是顯示這兩個QWidget中的哪一個呢?呼叫對應的QWidget的方法的時候也會出現同樣的問題)。如果有什麼介面庫支援控制元件的多繼承的,請大家在評論區留言,我也學習學習。

    假設A是虛基類那麼解決了二義性問題。

但是會碰到B,C,D這幾個指標cast的問題。這個的大概意思就是,指標之間往往存在cast轉換,或者顯示型別轉換,BC在同為D的父親的時候,有可能造成轉換混亂的結果(假設一個B轉換成一個D,那麼對應的D中是沒有C方法的(因為它實際指向的是一個B物件),這樣有時有很多混亂的情形)。

    黑了一把多繼承,而單繼承的話,上面兩個問題都不會碰到。下面是QWidget的繼承樹結構圖。大致Qt涉及到QWidget模式的介面開發的內容都有一點涉及。其實自己最初是想做一下Qt所有從QObject開始的所有結構圖,但是最終也只選取了qtbase中QWidget這一個模組。原因還是這個工程量很大,第二也是自己對嵌入式,qml,qt3d,安卓,串列埠,感測器…….這些也不是那麼瞭解。