用 C++ 設計一個不能被繼承的類

來源:互聯網
上載者:User

分析:這是Adobe  公司 2007  年校園招聘的最新筆試題。這道題除了考察應聘者的

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

在Java  中定義了關鍵字 final  ,被 final  修飾的類不能被繼承。但在 C++  中沒

有final  這個關鍵字,要實現這個要求還是需要花費一些精力。 

首先想到的是在 C++ 中,子類的建構函式會自動調用父類的建構函式。同樣,

子類的解構函式也會自動調用父類的解構函式。要想一個類不能被繼承,我

們只要把它的建構函式和解構函式都定義為私人函數。那麼當一個類試圖從

它那繼承的時候,必然會由於試圖調用建構函式、解構函式而導致編譯錯誤。  

可是這個類的建構函式和解構函式都是私人函數了,我們怎樣才能得到該類

的執行個體呢?這難不倒我們,我們可以通過定義靜態來建立和釋放類的執行個體。

基於這個思路,我們可以寫出如下的代碼: 

//////////////////////////////////////////////////////////////////

///// 

// Define a class which can't be derived from 

//////////////////////////////////////////////////////////////////

///// 

class FinalClass1 

public : 

  static FinalClass1* GetInstance() 

  { 

    return new FinalClass1; 

  } 

 

  static void DeleteInstance( FinalClass1* pInstance) 

  { 

    delete pInstance; 

    pInstance = 0; 

  } 

 

private : 

  FinalClass1() {} 

  ~FinalClass1() {} 

}; 

這個類是不能被繼承,但在總覺得它和一般的類有些不一樣,使用起來也有

點不方便。比如,我們只能得到位於堆上的執行個體,而得不到位於棧上執行個體。 

能不能實現一個和一般類除了不能被繼承之外其他用法都一樣的類呢?辦法

總是有的,不過需要一些技巧。請看如下代碼: 

//////////////////////////////////////////////////////////////////

///// 

// Define a class which can't be derived from 

//////////////////////////////////////////////////////////////////

///// 

template <typename T> class MakeFinal 

  friend T; 

 

private : 

  MakeFinal() {} 

  ~MakeFinal() {} 

}; 

 

class FinalClass2 : virtual public MakeFinal<FinalClass2> 

public : 

  FinalClass2() {} 

  ~FinalClass2() {} 

}; 

這個類使用起來和一般的類沒有區別,可以在棧上、也可以在堆上建立執行個體。

儘管類 MakeFinal <FinalClass2> 的建構函式和解構函式都是私人的,但由

於類 FinalClass2 是它的友元函數,因此在 FinalClass2 中調用 MakeFinal 

<FinalClass2> 的建構函式和解構函式都不會造成編譯錯誤。 

但當我們試圖從 FinalClass2 繼承一個類並建立它的執行個體時,卻不同通過編

譯。 

class Try : public FinalClass2 

public : 

  Try() {} 

  ~Try() {} 

}; 

 

Try temp;   

由於類 FinalClass2 是從類 MakeFinal  <FinalClass2> 虛繼承過來的,在調

用 Try 的建構函式的時候,會直接跳過 FinalClass2 而直接調用 MakeFinal 

<FinalClass2> 的建構函式。非常遺憾的是, Try 不是 MakeFinal 

<FinalClass2> 的友元,因此不能調用其私人的建構函式。 

基於上面的分析,試圖從 FinalClass2 繼承的類,一旦執行個體化,都會導致編

譯錯誤,因此是 FinalClass2 不能被繼承。這就滿足了我們設計要求。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.