C++面試題目
如何設計一個不能被繼承的C++類。
這道題除了考察應聘者的C++基本功底外,還能考察反應能力,是一道很好的題目。
解決方案
思路: 構造函數和析構函數私有化。
在C++ 中,在構造對象時,子類的構造函數會自動調用父類的構造函數,在對象析構時,子類的析構函數也會自動調用父類的析構函數。要想一個類不能被繼承,我們只要把它的構造函數和析構函 數都定義為私有函數。那麼當一個類試圖從它那繼承的時候,必然會由於試圖調用構造函數、析構函數而導致編譯錯誤。
但是這個類的構造函數和析構函數都是私有函數了,這樣一來子類不能訪問父類的構造函數和析構函數,也就實現了無法繼承的需求。然而這樣一來,這個類在其他地方也就不能實例化了,沒有存在的意義。
我們怎樣才能得到該類的實例呢?我們可以通過定義靜態方法來創建和釋放類的實例。
雖然通過靜態成員函數可以創建類的實例,但是不能像其他正常的類一樣,在棧上實例化類的對象,有沒有辦法呢?還是有一些方法的。
這個類使用起來和一般的類沒有區別,可以在棧上、也可以在堆上創建實例。
儘管類 MakeFinal 的構造函數和析構函數都是私有的,但由於類 FinalClass是它的友元函數,因此在FinalClass中調用 MakeFinal 的構造函數和析構函數都不會造成編譯錯誤。 但當試圖從FinalClass繼承一個類並創建它的實例時,卻會導致編譯失敗。
閱讀更多 半杯茶的小酒杯 的文章