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

2021-09-06 18:40:24 字數 880 閱讀 8386



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

template

class a

~a() {}

};class b : virtual public a

~b() {}};

類b使用起來和一般的類沒有差別,能夠在棧上、也能夠在堆上建立例項。雖然類 a的建構函式和析構函式都是私有的,但因為類b是它的友元函式,因此在b中呼叫 a的建構函式和析構函式都不會造成編譯錯誤。

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

class c : virtual public b

~c() {}

};因為類 b 是從類 a虛繼承過來的,在呼叫 c的建構函式的時候,會直接跳過b而直接呼叫a的建構函式。很遺憾的是,c 不是 a的友元,因此不能呼叫其私有的建構函式。 

基於上面的分析,試圖從 b 繼承的類,一旦例項化,都會導致編譯錯誤,因此是 b 不能被繼承。這就滿足了我們設計要求。

void main( void )

還有還有一種思路,比如:

class theonlyinstance

static void releasetheonlyinstance(theonlyinstance* pinstance)

private:

theonlyinstance(){}

~theonlyinstance(){}

}這個類是不能被繼承,可是我們僅僅能得到位於堆上的例項,得不到位於棧上的例項。

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

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

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

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

設計乙個不能被繼承的類

分類 cpp 2012 02 19 20 33 1390人閱讀收藏 舉報destructor constructor function class 編譯器c 在c 中每個類都乙個建構函式和乙個析構函式,即使使用者不明確定義,系統也會類定義乙個預設的建構函式和析構函式。當建立該類的物件可以顯示或者隱式...