用C 實現乙個不能被繼承的類

2022-06-02 13:33:12 字數 1795 閱讀 2122

一道筆試題的思考:

記得,找工作時,遇到了這樣的一道筆試題。

記不清是那個公司的筆試題,反正覺得自己當時還真費了一點功夫的,但是也就搞定了一部分,結果還是被另一部分給鄙視啦!

現在靜下來分析實現如下:

題目:用c++設計乙個不能被繼承的類

不能被繼承?不能被繼承?不能被繼承?按照繼承的理論知識分析,我們只要把類的建構函式設定為私有的,即可解決問題。

因為那樣的話,子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。

但是,假設那樣,這個類我們在其它地方怎麼使用呢?那這樣子給我們的利用也造成了一定的障礙。

好了。你是不是也想到了,定義靜態方法,在方法內部實現乙個物件,然後返回它的指標。

ok?那怎麼釋放掉呢?再照樣設計乙個釋放記憶體函式,問題就會迎刃而解。

ok。按照這個邏輯分析。示例**如下:

1 #include2

using

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 #include2

using

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 設計乙個不能被繼承的類

如果將乙個類設計成不能被繼承來的類,只要把類的建構函式設定為私有的,即可解決問題。因為那樣的話,子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。因為構造方法為私有,所以外部也不能呼叫建構函式生成例項,我們需要提供特殊的方法建立例項。具體做法是定義靜...