面試題48 不能被繼承的類

2022-05-02 16:21:11 字數 1544 閱讀 2919

c11已有關鍵字final

首先想到的是在c++ 中,子類的建構函式會自動呼叫父類的建構函式。同樣,子類的析構函式也會自動呼叫父類的析構函式。要想乙個類不能被繼承,我們只要把它的建構函式和析構函式都定義為私有函式。那麼當乙個類試圖從它那繼承的時候,必然會由於試圖呼叫建構函式、析構函式而導致編譯錯誤。

可是這個類的建構函式和析構函式都是私有函式了,我們怎樣才能得到該類的例項呢?這難不倒我們,我們可以通過定義靜態來建立和釋放類的例項。基於這個思路,我們可以寫出如下的**:

//

********************方法一********************

class

sealedclass1

static

void deleteinstance( sealedclass1*pinstance)

private

: sealedclass1() {}

~sealedclass1() {}

};//

如果試圖從sealedclass1繼承出新的型別,

//將會導致編譯錯誤。

/*class try1 : public sealedclass1

~try1() {}

};*/

這個類是不能被繼承,但在總覺得它和一般的類有些不一樣,使用起來也有點不方便。比如,我們只能得到位於堆上的例項,而得不到位於棧上例項。

能不能實現乙個和一般類除了不能被繼承之外其他用法都一樣的類呢?辦法總是有的,不過需要一些技巧。請看如下**:

1

//********************方法二********************

2 template class

makesealed

38 ~makesealed() {}9};

1011

class sealedclass2 : virtual

public makesealed12

15 ~sealedclass2() {}

16};

1718

//如果試圖從sealedclass1繼承出新的型別,

19//

將會導致編譯錯誤。

20/*

21class try2 : public sealedclass2

2225

~try2() {}

26};

27*/

注意sealedclass2是虛繼承,原因如下:

呼叫try的建構函式時,會先呼叫它包含的所有virtual base類的建構函式,然後再呼叫它上層的base類建構函式,然後是設定vptr,最後是初始化列表和子類建構函式體內的使用者**。try不能呼叫makefinal的私有成員,因此引發編譯錯誤。

如果不是virtual繼承,那麼try首先呼叫的是它上層base類的建構函式,也就是finalclass的建構函式,然後由finalclass的建構函式來呼叫makefinal的建構函式,由於finalclass是makefinal的友元,因此該呼叫合法,所以try得以正確構造,而沒有編譯錯誤。

不能被繼承的類

不能被繼承的類,就是子類在呼叫父類的建構函式的時候失敗就沒法被整合了,所以可以把析構函式定義為private,因為在呼叫建構函式的時候,會先檢查析構函式,如果析構是private的,那麼建構函式也沒法被呼叫。這個問題和另一篇文章類似我們通過設定共有的static函式來構造和析構。class a a ...

不能被繼承的類

題目 用c 設計乙個不能被繼承的類。分析 乙個類被繼承後,在生成派生類物件時,派生類會主動呼叫父類的建構函式,所以如果父類的建構函式被設定成私有時,派生類的物件就無法構建。一 直接將建構函式設為私有函式 class sealedclass static void deleteinstance sea...

不能被繼承的類

何如建立乙個不能被繼承的類呢?c 語法規定虛基類必須由子類顯示初始化。如果你不在初始化列表裡顯示呼叫虛基類的建構函式,則編譯器會呼叫預設建構函式 如果類沒有預設建構函式,則編譯不通過。利用這個特點,建立乙個private建構函式的類a,並讓類b成為他的友元類,讓類b虛繼承類a 此時類b就不能被繼承了...