一道筆試題的思考:
記得,找工作時,遇到了這樣的一道筆試題。
記不清是那個公司的筆試題,反正覺得自己當時還真費了一點功夫的,但是也就搞定了一部分,結果還是被另一部分給鄙視啦!
現在靜下來分析實現如下:
題目:用c++設計乙個不能被繼承的類
不能被繼承?不能被繼承?不能被繼承?按照繼承的理論知識分析,我們只要把類的建構函式設定為私有的,即可解決問題。
因為那樣的話,子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。
但是,假設那樣,這個類我們在其它地方怎麼使用呢?那這樣子給我們的利用也造成了一定的障礙。
好了。你是不是也想到了,定義靜態方法,在方法內部實現乙個物件,然後返回它的指標。
ok?那怎麼釋放掉呢?再照樣設計乙個釋放記憶體函式,問題就會迎刃而解。
ok。按照這個邏輯分析。示例**如下:
1 #include2using
namespace
std;34
classa5
14static
void destruct(a *pintance)
1519
20private:21
a(){}
22 ~a(){}
2324
public:25
intnum;
26};
2728
void
main()
29
好了,這個類就這樣子。按照理論分析,我們的實踐結果也是完全成立的。
但是,這個題,它比較有挑戰性,什麼意思呢?難道你沒有發現,咱們這水平也就僅僅有面試資格,還不可以破格錄用的。
怎麼啦?你可能會反問我。難道你真的沒有看明白?確定沒有看明白?如果是真的話,那我就告訴你吧!
咱們的類不可以實現在棧上建立物件。也就是說,僅僅只可以在堆上構建任何的乙個物件,而在棧上就無能為力了。
私有的建構函式極大的侷限性就這樣一覽無餘了。(其實,上面類設計即是一種只可以建立堆物件,不可以建立棧物件的情況。)
好吧!我們修改它,也就是所謂的為它打「補丁吧」,請看示例**:
1 #include2using
namespace
std;
34 template 5
class
base
610 ~base() {}
11};
1213
class finalclass : virtual
public base14
17 ~finalclass() {}
18};
1920
class testclass : public
finalclass21;
2324
void
main()
25
ok **碼完。現在分析finalclass類:
繼承於base類,base為虛基類,因為它是base的友元,所以,它可以訪問基類的私有建構函式,以及析構函式。編譯執行時是正確的。
也就是說,可以建立堆上的物件,並且可以構建棧上的物件。
可否繼承?假如它作為乙個基類被另乙個類繼承,編譯時是完全可以通過的。
這一點沒有什麼疑問。
但問題就在需要構建物件時:
當派生類testclass在構造物件時,因為是虛繼承,所以派生類testclass的建構函式會直接去呼叫base基類的建構函式,而base的建構函式是私有的。編譯錯誤!
這就是乙個真正不能被繼承的類。
C 實現乙個不能被繼承的類
要設計乙個不能被繼承的類,考慮c 11的新特性的話,有三種方法 1 就是將該類的建構函式和析構函式設為private 或者僅僅將析構函式設為private 這樣派生類無法呼叫基類的建構函式和析構函式,從而不能繼承。要建立物件,可以在該類中設乙個static成員函式,提供返回乙個該類物件指標,這種方法...
C 實現乙個不能被繼承的類
題目 用c 設計乙個不能被繼承的類 1 不能被繼承?按照繼承的理論,只要把類的建構函式設為私有,即可解決問題。此時子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。問題 如何產生這個類的例項物件和釋放物件呢?2 顯然定義靜態方法,在方法內部實現乙個物...
用C 設計乙個不能被繼承的類
如果將乙個類設計成不能被繼承來的類,只要把類的建構函式設定為私有的,即可解決問題。因為那樣的話,子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。因為構造方法為私有,所以外部也不能呼叫建構函式生成例項,我們需要提供特殊的方法建立例項。具體做法是定義靜...