C++設計類不克不及被繼續的辦法實例講授。本站提示廣大學習愛好者:(C++設計類不克不及被繼續的辦法實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計類不克不及被繼續的辦法實例講授正文
起首想到的是在C++中,子類的結構函數會主動挪用父類的結構函數。異樣,子類的析構函數也會主動挪用父類的析構函數。要想一個類不克不及被繼續,只需把它的結構函數和析構函數都界說為公有函數。那末當一個類試圖從它那繼續的時刻,必定會因為試圖挪用結構函數、析構函數而招致編譯毛病。
可是這個類的結構函數和析構函數都是公有函數了,如何能力獲得該類的實例呢?可以經由過程界說靜態來創立和釋放類的實例。基於這個思緒,可以寫出以下的代碼:
///////////////////////////////////////////////////////////////////////
// Define a class which can't be derived from
///////////////////////////////////////////////////////////////////////
class FinalClass1
{
public :
static FinalClass1* GetInstance()
{
return new FinalClass1;
}
static void DeleteInstance( FinalClass1* pInstance)
{
delete pInstance;
pInstance = 0;
}
private :
FinalClass1() {}
~FinalClass1() {}
};
這個類是不克不及被繼續,但在總認為它和普通的類有些紛歧樣,應用起來也有點不便利。好比,只能獲得位於堆上的實例,而得不到位於棧上實例。
能不克不及完成一個和普通類除不克不及被繼續以外其他用法都一樣的類呢?方法老是有的,不外須要一些技能。請看以下代碼:
///////////////////////////////////////////////////////////////////////
// Define a class which can't be derived from
///////////////////////////////////////////////////////////////////////
template <typename T>
class MakeFinal
{
friend T;
private :
MakeFinal() {}
~MakeFinal() {}
};
class FinalClass2 : virtual public MakeFinal<FinalClass2>
{
public :
FinalClass2() {}
~FinalClass2() {}
};
這個類應用起來和普通的類沒有差別,可以在棧上、也能夠在堆上創立實例。雖然類MakeFinal<FinalClass2>的結構函數和析構函數都是公有的,但因為類FinalClass2是它的友元函數,是以在FinalClass2中挪用MakeFinal<FinalClass2>的結構函數和析構函數都不會形成編譯毛病。
但當試圖從FinalClass2繼續一個類並創立它的實例時,卻分歧經由過程編譯。
class Try : public FinalClass2
{
public :
Try() {}
~Try() {}
};
Try temp;
因為類FinalClass2是從類MakeFinal<FinalClass2>虛繼續過去的,在挪用Try的結構函數的時刻,會直接跳過FinalClass2而直接挪用MakeFinal<FinalClass2>的結構函數。異常遺憾的是,Try不是MakeFinal<FinalClass2>的友元,是以不克不及挪用其公有的結構函數。
基於下面的剖析,試圖從FinalClass2繼續的類,一旦實例化,都邑招致編譯毛病,是以是FinalClass2不克不及被繼續。這就知足了設計請求。
C++11中曾經有了final症結字:它的感化是指定類的虛函數不克不及被該類的繼續類重寫(override),或許是指定一個類成為一個不克不及被繼續的類(final class)。
struct A
{
virtual void foo() final;
};
struct B final : A
{
void foo(); // Error: foo cannot be overridden as it's final in A
};
struct C : B // Error: B is final
{
};