1. 程式人生 > >C++中讓一個類不能被繼承

C++中讓一個類不能被繼承

學過一點java基礎的人都知道,在java中讓一個類不能被繼承,直接在類前面用final關鍵字修飾就好。但是在C++中如何實現呢?
一般來說有兩種思路。
1、將建構函式申明為私有的,然後定義一個靜態函式來建立物件,這種很多人都可以想到。但靈活性不好,每次要構造物件的時候還得呼叫這個靜態函式。
2、利用友元不能被繼承的特性來做。
1)可以先定義一個沒有任何資料成員和成員函式的基類,將其建構函式申明為私有的
2)讓不想被繼承的類繼承為上面那個基類,同時申明為其友元,這裡我們為了不必每次要構造一個不能被繼承的類時,都要改基類,我們利用模板來泛化基類中的友元類。程式碼如下:

“`
/*
@author rly
@date 2018.2.3
這是一個驗證不讓一個類被繼承的方法的例項
*/

template
class CfinalClass
{
public:
friend T;
private:
CfinalClass()
{

}
~CfinalClass()
{

}

};

class CParent : public CfinalClass
{
public:
CParent()
{

}
~CParent()
{

}

};
這樣我們如果再寫一個類Cchild繼承CParent類時,由於友元特性不能被繼承,此時Cchild類無法訪問CfinalClass中的建構函式,從而無法構造物件。
但是結果確實能夠構造,這是為什麼呢?
因為由於Cchild類繼承CParent類, 如果CParent類是普通的公有,保護或私有繼承會先呼叫CParent類的建構函式,CParent類又再先呼叫CfinalClass類的建構函式再呼叫自己的建構函式,這明顯是可以的啊。

如果能讓Cchild類按繼承的層級,直接從上到下呼叫建構函式,而不是通過其父類呼叫就好了。這裡就可以藉助虛繼承的特性,將CParent類的繼承方式改為virtual繼承就好了。

更多建構函式特性請參閱《深度探索C++物件模型》一書。