在C++中如何阻止類被繼承詳解
這個話題是源自于一個面試題,我在網(wǎng)上查了一下有不少這方面的解說!我自己整理了一下,選擇了一個自認為是最優(yōu)方案!
我們從最簡單的開始:
首先,大家都知道要阻止類被實例化,可以通過使用private or protected 關(guā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,并且還不用擔心被繼承了。不過還是要解釋一下為什么阻止了繼承?
當我們寫出下面的代碼時,編譯器在編譯過程中做了什么呢?
class subclass : public SampleSealedClass { };
首先,當你在實例化subclass的時候,會先調(diào)用SampleSealedClass的構(gòu)造函數(shù),而在這之前會調(diào)用Sealed類的默認構(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語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07