不能被繼承的類

2021-08-14 17:47:15 字數 1008 閱讀 3065

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

在c++中,子類的建構函式會自動呼叫父類的建構函式,子類的析構函式也會自動呼叫父類的析構函式。要想乙個類不能被繼承,我們只要把它的建構函式和析構函式都定義為私有函式。那麼當乙個類試圖從它那裡繼承的時候,必然會由於呼叫建構函式、析構函式而導致編譯錯誤。同時,我們可以通過定義公有的靜態函式來創造和釋放類的例項。

class sealedclass

static

void deleteinstance(sealedclass* pinstance)

private:

sealedclass(){}

~sealedclass(){}

};

上面實現的類的確不能被繼承,但它只能在堆上建立例項不能在棧上建立例項,那麼如何實現乙個類可以在堆上和棧上建立例項,同時不能被繼承呢?

templateclass makesealed

~makesealed(){}

};class sealedclass1 :virtual

public makesealed

~sealedclass1(){}

};

這個sealedclass1既可以在棧上建立例項,也可以在堆上建立例項。類makesealed的建構函式和析構函式都是私有的,但由於類sealedclass1是它的友元型別,因此在sealedclass1中呼叫makesealed的建構函式和析構函式都不會引起編譯錯誤。

但當我們試圖從sealedclass1中繼承乙個類並建立它的例項的時候,卻不能通過編譯。

由於類sealedclass1是從類makesealed虛繼承過來的,在呼叫try的建構函式的時候,會跳過sealedclass1而直接呼叫makesealed的建構函式。但try不是makesealed的友元函式,因此不能呼叫它的私有建構函式。

不能被繼承的類

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

不能被繼承的類

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

不能被繼承的類

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