C++面試題-設計一個不能被繼承的類

C++面試題目

如何設計一個不能被繼承的C++類。

這道題除了考察應聘者的C++基本功底外,還能考察反應能力,是一道很好的題目。

解決方案

思路: 構造函數和析構函數私有化。

在C++ 中,在構造對象時,子類的構造函數會自動調用父類的構造函數,在對象析構時,子類的析構函數也會自動調用父類的析構函數。要想一個類不能被繼承,我們只要把它的構造函數和析構函 數都定義為私有函數。那麼當一個類試圖從它那繼承的時候,必然會由於試圖調用構造函數、析構函數而導致編譯錯誤。

C++面試題-設計一個不能被繼承的類

但是這個類的構造函數和析構函數都是私有函數了,這樣一來子類不能訪問父類的構造函數和析構函數,也就實現了無法繼承的需求。然而這樣一來,這個類在其他地方也就不能實例化了,沒有存在的意義。

我們怎樣才能得到該類的實例呢?我們可以通過定義靜態方法來創建和釋放類的實例。

C++面試題-設計一個不能被繼承的類

雖然通過靜態成員函數可以創建類的實例,但是不能像其他正常的類一樣,在棧上實例化類的對象,有沒有辦法呢?還是有一些方法的。

C++面試題-設計一個不能被繼承的類

這個類使用起來和一般的類沒有區別,可以在棧上、也可以在堆上創建實例。

儘管類 MakeFinal 的構造函數和析構函數都是私有的,但由於類 FinalClass是它的友元函數,因此在FinalClass中調用 MakeFinal 的構造函數和析構函數都不會造成編譯錯誤。 但當試圖從FinalClass繼承一個類並創建它的實例時,卻會導致編譯失敗。


分享到:


相關文章: