如何定義乙個不能被繼承的類

2021-10-04 02:42:42 字數 1583 閱讀 2567

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

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

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

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

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

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

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

1 #include2 using  namespace std;

3 4 class a

5 14 static void destruct(a * pintance)

15

19 20 private:

21 a(){}

22 ~a(){}

23 24 public:

25 int num;

26 };

27 28 void main()

29

好了,這個類就這樣子。按照理論分析,我們的實踐結果也是完全成立的。

但是,這個題,它比較有挑戰性,什麼意思呢?難道你沒有發現,咱們這水平也就僅僅有面試資格,還不可以破格錄用的。

怎麼啦?你可能會反問我。難道你真的沒有看明白?確定沒有看明白?如果是真的話,那我就告訴你吧!

咱們的類不可以實現在棧上建立物件。也就是說,僅僅只可以在堆上構建任何的乙個物件,而在棧上就無能為力了。

私有的建構函式極大的侷限性就這樣一覽無餘了。(其實,上面類設計即是一種只可以建立堆物件,不可以建立棧物件的情況。)

好吧!我們修改它,也就是所謂的為它打「補丁吧」,請看示例**:

1 #include2 using namespace std;

3 4 template 5 class base

6 10 ~base() {}

11 };

12 13 class finalclass : virtual public base14

17 ~finalclass() {}

18 };

19 20 class testclass : public finalclass

21 ;

23 24 void main()

25

ok **碼完。現在分析finalclass類:

繼承於base類,base為虛基類,因為它是base的友元,所以,它可以訪問基類的私有建構函式,以及析構函式。編譯執行時是正確的。

也就是說,可以建立堆上的物件,並且可以構建棧上的物件。

可否繼承?假如它作為乙個基類被另乙個類繼承,編譯時是完全可以通過的。這一點沒有什麼疑問。

但問題就在需要構建物件時:

當派生類testclass在構造物件時,因為是虛繼承,所以派生類testclass的建構函式會直接去呼叫base基類的建構函式,而base的建構函式是私有的。編譯錯誤!

這就是乙個真正不能被繼承的類。

如何定義乙個不能被繼承的類

方法一 將建構函式宣告為私有的 如果把乙個類的建構函式宣告為私有的,那麼這個類就不能被繼承。但是這也引入了乙個問題,不能在類外定義這個類的物件,所以我們還需要在類內定義乙個靜態的成員函式來返回建立的這個物件。class aa protected aa 方法二 我們可以宣告乙個輔助的類a,把類a這個類...

C 定義乙個不能被繼承的類

如何定義乙個不能被繼承的類?假設有乙個類b,如果把b的建構函式宣告為私有的,那麼b這個類就不能被繼承,但是這也引入了乙個問題,不能在類外定義b型別的物件,那要怎麼解決這個問題呢?方法1 我們可以在類內建立乙個物件並提供乙個靜態的介面,返回建立的這個物件。但是如果使用這種方法的話,在定義b的物件的時候...

如何實現乙個不能被繼承的類

首先我們要知道,在c 中,子類的建構函式會呼叫基類的構造進行合成,要想乙個類不被繼承,只要把它的建構函式定義成私有,子類就沒有辦法訪問基類建構函式,從而就阻止了進行子類構造物件 可是問題又來了,你把乙個類的建構函式定義為私有的,那它自己也定義不出物件,這該如何解決。這時我們想到了靜態函式,靜態成員函...