實現乙個無法被繼承的C 類

2021-04-16 03:22:39 字數 2153 閱讀 2596

乙個類不能被繼承,也就是說它的子類不能構造父類,這樣子類就沒有辦法例項化整個子類從而實現子類無法繼承父類。我們可以將乙個類的建構函式宣告為私有,使得這個類的建構函式對子類不可見,那麼這個類也就不能繼承了。但是,這引出乙個問題,客戶程式豈不是也無法例項化這個類了?ok,讓我們參考一下singleton模式,用乙個static函式來幫助建立這個類的例項,問題就解決了!

class

cparent

~cparent(){}

intm_v;

static

cparent 

*m_instance;

public

:void

fun()

static

cparent 

*getinstance(

intv);

};cparent 

*cparent::m_instance 

=null;

cparent 

*cparent::getinstance(

intv)

這是乙個有效的方法,但是static函式建立出來的例項必然是static的。而且,這個類不能像普通的類那樣構建物件,比如:

cparent c;  

//impossible

換個思路考慮一下,友元不也是不能被繼承的麼?我們可以把類的建構函式定義為private的同時,定義友元函式來幫助構造類的例項。

class

cparent

~cparent();

intm_v;

public

:void

fun()

friend cparent 

*getinstance(

intv);

};cparent 

*getinstance(

intv)

這個類也是不能被繼承的,但是出現的問題和前面一樣:我們還是不能像對普通類那樣對待這個類。

現在設想一下,有乙個cparent類,我們不希望他能夠被繼承。在友元不能被繼承的思路指引下,我們要考慮讓cparent的友元屬性不能被繼承。假設有乙個輔助類cnoheritance,cparent是cnoheritance類的友元。還要假設乙個cchild類,它試圖去繼承cparent類(如果它有這個能耐的話)。

先把cnoheritance類的建構函式定義成private,然後將cparent宣告為cnoheritance的友元類。同時cparent繼承了cnoheritance類。到目前為止,cnoheritance除了cparent類以外,誰也無法對它進行訪問和例項化。cchild因為無法繼承cparent的友元特性,所以cchild無法對cnoheritance直接進行例項化(但是可以通過cparent)。

到目前為止,cparent還是可以被繼承的。這是乙個trick.讓我們整理一下思路,下面的圖說明了cnoheritance, cparent和cchild三個類之間的關係。

如果我們讓cparent類虛繼承cnoheritance類,根據虛繼承的特性,虛基類的建構函式由最終的子類負責構造。因此cchild如果要想繼承cparent,它必須能夠構造cnoheritance,這是不可能的!因此,我們的cparent也就終於成為了乙個無法繼承的類。

class

cnoheritance

~cnoheritance(){}

friend 

class

cparent;

};class

cparent : virtual 

public

cnoheritance

~cparent(){};

private

:int

m_v;

public

:void

fun()

};class

cchild : 

public

cparent

~cchild(){}};

需要注意的是,我們這裡引入的

cnoheritance

類對整個程式而言,只引入了

private

的建構函式和析構函式,所以不會因為可能的菱形繼承帶來二義性.

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

要設計乙個不能被繼承的類,考慮c 11的新特性的話,有三種方法 1 就是將該類的建構函式和析構函式設為private 或者僅僅將析構函式設為private 這樣派生類無法呼叫基類的建構函式和析構函式,從而不能繼承。要建立物件,可以在該類中設乙個static成員函式,提供返回乙個該類物件指標,這種方法...

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

題目 用c 設計乙個不能被繼承的類 1 不能被繼承?按照繼承的理論,只要把類的建構函式設為私有,即可解決問題。此時子類就沒有辦法訪問基類的建構函式,從而就阻止了進行子類構造物件的任務實現,也就達到了不可繼承的目的。問題 如何產生這個類的例項物件和釋放物件呢?2 顯然定義靜態方法,在方法內部實現乙個物...

實現乙個不能被繼承的類

分析 普通類都能被繼承,但當這個類的建構函式被宣告為私有時,這個類便不能被繼承,同時也不能在類外面定義該型別的物件,該怎麼解決這個問題呢?方法一 類物件的構造是通過建構函式實現的,如果將建構函式宣告為私有或者保護型別,那麼在類外是不能呼叫建構函式的,也就不能在類定義出物件。對此,我們可以在類裡定義乙...