日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]

發布時間:2025/3/21 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(32)-不能被继承的类[C/C++/C#] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:用C++設計一個不能被繼承的類。

分析:這是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不能被繼承。這就滿足了我們設計要求。

?

本文已經收錄到《劍指Offer——名企面試官精講典型編程題》一書中,有改動,書中的分析講解更加詳細。歡迎關注。

博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。

總結

以上是生活随笔為你收集整理的程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。