在C++中如何阻止類被繼承詳解
這個話題是源自于一個面試題,我在網(wǎng)上查了一下有不少這方面的解說!我自己整理了一下,選擇了一個自認(rèn)為是最優(yōu)方案!
我們從最簡單的開始:
首先,大家都知道要阻止類被實例化,可以通過使用private or protected 關(guān)鍵字來聲明默認(rèn)構(gòu)造函數(shù)。那么在阻止類被繼承的時候,我們需要用到這個技巧。其次,阻止類被繼承還需要使用private來控制繼承的基類。
namespace SamplePrivate
{
#ifdef NDEBUG
class Sealed
{
protected:
Sealed() {};
friend class SampleSealedClass; // 設(shè)置友類,以便訪問Sealed的構(gòu)造函數(shù)
};
class SampleSealedClass : private virtual Sealed
{
};
#else
class SampleSealedClass {}
#endif
}
這樣我們就可以實例化SampleSealedClass,并且還不用擔(dān)心被繼承了。不過還是要解釋一下為什么阻止了繼承?
當(dāng)我們寫出下面的代碼時,編譯器在編譯過程中做了什么呢?
class subclass : public SampleSealedClass
{
};
首先,當(dāng)你在實例化subclass的時候,會先調(diào)用SampleSealedClass的構(gòu)造函數(shù),而在這之前會調(diào)用Sealed類的默認(rèn)構(gòu)造函數(shù),但是我們發(fā)現(xiàn)Sealed是不能被實例化的,并且通過private virtual的繼承只能被SampleSealedClass調(diào)用,因此這很好的阻止了類被繼承。但是這里我們只能完成一個類被不被繼承,那么是否有更好的方法來實現(xiàn)阻止任意類被繼承呢?
那就需要用到模板了:
#ifdef NDEBUG
namespace SealedClasses
{
class Sealed
{
protected:
Sealed() {}
};
template<class T> class TypeWapper
{
public:
typedef T type;
};
}
template<typename T> class BaseSealed : private virtual SealedClasses::Sealed
{
friend class SealedClasses::TypeWapper<T>::type;
};
#else
template<typename T> class BaseSealed
{
};
#endif
這里的TypeWapper主要是將外部類型傳遞到SealedClasses的,從而能得到訪問Sealed構(gòu)造函數(shù)的能力。不過這段代碼在GCC4.0中通過編譯,而在vs2008中不能通過??梢韵蛳旅孢@樣來引用:
class subclass : BaseSealed<subclass>
{
public:
subclass() { cout << "subclass" << endl; }
};
// 下面這個會編譯失敗
class ssubclass : public subclass
{
public:
ssubclass() { cout << "ssubclass" << endl; }
};
將想法付諸于實踐,借此來影響他人是一個人存在的真正價值
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
c++ builder TreeView控件節(jié)點遍歷代碼
這篇文章介紹了c++ builder TreeView控件節(jié)點遍歷代碼,有需要的朋友可以參考一下2013-09-09
Visual Studio 2019修改編碼UTF-8的實現(xiàn)
這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C++ 隨機(jī)數(shù)字以及隨機(jī)數(shù)字加字母生成的案例
這篇文章主要介紹了C++ 隨機(jī)數(shù)字以及隨機(jī)數(shù)字加字母生成的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Inline Hook(ring3)的簡單C++實現(xiàn)方法
這篇文章主要介紹了Inline Hook(ring3)的簡單C++實現(xiàn)方法,需要的朋友可以參考下2014-08-08

