.NET的類可以用 sealed 關(guān)鍵字來說明一個類是最終類,也就是說不能作為基類,不能被繼承。Java也有個相同的關(guān)鍵字final完成同樣的功能。這個功能有時候很有用。但是C++沒有這個關(guān)鍵字。那如何在C++中實現(xiàn)類似的功能呢?
如何實現(xiàn)不可繼承的類 沐楓網(wǎng)志
曾經(jīng)在CUJ上看到一篇文章介紹過一個方法,但具體網(wǎng)址已經(jīng)忘記了,Sorry。但是方法卻記下來了。它用一個私有的虛基類來實現(xiàn)。
我在這種方法的基礎(chǔ)上,作了一個通用的工具類:Sealed,只要以此類為基類,那么該類就不可被繼承。為了進行性能優(yōu)化,在Release版本中,還將Sealed作成一個空類。
Sealed類的實現(xiàn)如下:
#ifdef _DEBUG
namespace internalSealed
{
class Class_Is_Sealed
{
protected:
Class_Is_Sealed(){}
};
#ifndef _MSC_VER
template <class T>
class typewrapper
{
public:
typedef T type;
};
#endif
};
template <typename T>
class Sealed: private virtual internalSealed::Class_Is_Sealed
{
#ifdef _MSC_VER
friend T;
#else
friend class internalSealed::typewrapper<T>::type;
#endif
};
#else
template <typename T>
class Sealed
{
};
#endif
這樣子,在Debug方式下,只要一個類從Sealed繼承,就不可再被繼承了。
同時,在Release方式下,因為不再檢查是否可以被繼承,因而不產(chǎn)生開銷(空類會被編譯器優(yōu)化掉)。
使用例子: