本節書摘來自異步社群出版社《c++程式設計風格(修訂版)》一書中的第3章,第3.1節,作者:【美】tom cargill,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
c++程式設計風格(修訂版)
在程式清單3.1的程式中定義了一個用于處理字元堆棧的charstack類,以及用于處理整數堆棧的intstack類。我們将對這兩個類進行分析和評價,并且判斷這些類中的抽象是不是正确的、接口是否起到了相應的作用,以及類之間的繼承關系是不是合适的。
有些讀者在看到charstack和intstack時的第一反應可能是,這些類應該使用參數化類型來編寫,這也是ansi(參見ellis和stroustrup的著作,第341頁)建議的方法。在這裡我們暫時先不考慮這種做法,而是把注意力集中于對本章給出的代碼進行分析,理由主要有兩個:首先,在考慮使用其他方法來改寫這個程式之前,我們要重點了解這個程式在使用c++的核心特性時存在什麼樣的問題。在這個程式中,問題能夠更容易地暴露出來,而使用參數化類型則達不到這個目的;其次,在編寫本書時,參數化類型并沒有得到廣泛的應用,它們在某些情況下并不能很好地整合到c++中。而且,如果我們還沒有在如何使用參數化類型上積累足夠的程式設計經驗,那麼對于參數化類型程式設計風格的讨論就顯得為時過早。在本章的結尾部分,我們給出了使用模闆來改寫的程式。
程式清單3.1 最初的stack、charstack和intstack
在上述程式中,核心的設計思想是:由于charstack和intstack都是堆棧,是以它們有一個共同的基類stack。繼承的層次結構如圖3.1所示。
圖像說明文字
圖3.1 繼承的層次結構
隻有在仔細分析了這個程式之後,我們才會發現程式中的繼承是不必要的,并且容易使人産生誤解,是以應該去掉。事實上,在本程式中使用的公有繼承将破壞堆棧的封裝性。