用C++实现不能被继承的类
生活随笔
收集整理的這篇文章主要介紹了
用C++实现不能被继承的类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++中沒有自己定義這樣一個類,需要自己實現(xiàn)。
(1)將構(gòu)造函數(shù)設(shè)為私有
不能被繼承,則可以將構(gòu)造函數(shù)和析構(gòu)函數(shù)定義為private,這樣有個問題,我們也不能新建一個此類的變量。
可以使用static來新建和釋放內(nèi)存。如下示例:
class SealedClass0 { public:static SealedClass0* GetInstance() {return new SealedClass0();}static void DeleteInstance( SealedClass0* pInstance){delete pInstance;}private:SealedClass0() {}~SealedClass0() {} };(2)使用虛擬繼承和友元
將一個類A的構(gòu)造析構(gòu)函數(shù)定義為private;
定義子類B是A的友元;
子類B虛擬繼承(virtual public)A;
這樣定義的效果是可以創(chuàng)建B的實例但是不能被繼承,如果被子類C繼承,則C會跳過B自己來創(chuàng)建A,而C不能訪問A的構(gòu)造和析構(gòu)函數(shù);
如果不采用虛擬繼承,public時,C類會構(gòu)造B,B類來創(chuàng)建A,此時B是可以被繼承的。
class SealedClass1; class MakeSealed1 {friend SealedClass1;private:MakeSealed1() {}~MakeSealed1() {} };class SealedClass1 : virtual public MakeSealed1 { public:SealedClass1() {}~SealedClass1() {} };也可以采用模板的方式如下:
template <typename T> class MakeSealed {friend T;private:MakeSealed() {}~MakeSealed() {} };class SealedClass2 : virtual public MakeSealed<SealedClass2> { public:SealedClass2() {}~SealedClass2() {} };總結(jié)
以上是生活随笔為你收集整理的用C++实现不能被继承的类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typedef的用途
- 下一篇: 烙饼问题与搜索树