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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer]面试题48:不能被继承的类

發(fā)布時(shí)間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer]面试题48:不能被继承的类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面試題48:不能被繼承的類
題目:用C++設(shè)計(jì)一個(gè)不能被繼承的類。

? 常規(guī)的解法:把構(gòu)造函數(shù)設(shè)為私有函數(shù)

很多人都能夠想到,在 C++中子類的構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù),子類的析構(gòu)函數(shù)也會(huì)自動(dòng)調(diào)用父類的析構(gòu)函數(shù)。
要想一個(gè)類不能被繼承,我們只要把它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都定義為私有函數(shù)。那么當(dāng)一個(gè)類試圖從它那繼承的時(shí)候,必然會(huì)由于調(diào)用構(gòu)造函數(shù)、析構(gòu)函數(shù)而導(dǎo)致編譯錯(cuò)誤。
可是這個(gè)類型的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有函數(shù),我們?cè)鯓硬拍艿玫皆擃愋偷膶?shí)例呢?我們可以通過定義公有的靜態(tài)函數(shù)來創(chuàng)建和釋放類的實(shí)例。基于這個(gè)思路,我們可以寫出如下代碼:

class SealedClass1 { public:static SealedClass1 *GetInstance(){return new SealedClass1();}static void DeleteInstance(SealedClass1 *pInstance){delete pInstance;} private:SealedClass1() {};~SealedClass1() {}; };

這個(gè)類是不能被繼承,但總覺得它和普通的類型有些不一樣,使用起來有點(diǎn)不方便。比如我們只能得到位于堆上的實(shí)例,而得不到位于棧上的實(shí)例。

? 新奇的解法:利用虛擬繼承,能給面試官留下很好的印象

能不能實(shí)現(xiàn)一個(gè)與一般的類型相比除了不能被繼承之外其他用法都一樣的類型呢?辦法還是有的,不過需要一定的技巧。請(qǐng)看如下代碼:

template<typename T> class MakeSealed {friend T; private:MakeSealed() {};~MakeSealed() {}; };class SealedClass2 :virtual public MakeSealed<SealedClass2> { public:SealedClass2() {};~SealedClass2() {}; };

這個(gè)SealedClass2使用起來和一般的類型沒有區(qū)別,我們可以在棧上、也可以在堆上創(chuàng)建實(shí)例。盡管類MakeSealed的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有的,但由于類 SealedClass2 是它的友元類型,因此在SealedClass2中調(diào)用MakeSealed的構(gòu)造函數(shù)和析構(gòu)函數(shù)都不會(huì)引起編譯錯(cuò)誤。

但當(dāng)我們?cè)噲D從SealedClass2中繼承一個(gè)類并創(chuàng)建它的實(shí)例的時(shí)候,卻不能通過編譯。

比如我們從SealedClass2中繼承出類型Try:

class Try :public SealedClass2 { public:Try() {};~Try() {}; };

由于類SealedClass2是從類MakeSealed虛繼承過來的,在調(diào)用 Try 的構(gòu)造函數(shù)的時(shí)候,會(huì)跳過 SealedClass2 而直接調(diào)用MakeSealed的構(gòu)造函數(shù)。非常遺憾的是,Try 不是MakeSealed的友元類型,因此不能調(diào)用它的私有構(gòu)造函數(shù)。
通過上面的分析,我們發(fā)現(xiàn)從SealedClass2繼承的類,一旦實(shí)例化就會(huì)導(dǎo)致編譯出錯(cuò),因此SealedClass2不能被繼承,這也就滿足了題目的要求。

本題考點(diǎn):
● 考查發(fā)散思維能力。當(dāng)要求設(shè)計(jì)一個(gè)不能被繼承的類時(shí),應(yīng)聘者要馬上從把構(gòu)造函數(shù)定義為私有函數(shù)出發(fā)去尋找解題方法。
● 考查對(duì)C++多個(gè)概念的理解,比如構(gòu)造函數(shù)、模板、友元等。

總結(jié)

以上是生活随笔為你收集整理的[剑指offer]面试题48:不能被继承的类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。