最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C++中如何阻止類被繼承詳解

 更新時間:2021年09月28日 10:31:24   作者:moonz-wu  
這篇文章主要介紹了在C++中如何阻止類被繼承,對于C++初學(xué)者而言可以通過本文實例更好的理解類的原理及運用,需要的朋友可以參考下

這個話題是源自于一個面試題,我在網(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)文章

最新評論

工布江达县| 浦城县| 阳西县| 察哈| 鹿邑县| 麻城市| 泗阳县| 会泽县| 安化县| 南阳市| 石门县| 商丘市| 酉阳| 鞍山市| 顺平县| 巴塘县| 漳浦县| 卫辉市| 丰县| 安宁市| 巴彦县| 安龙县| 承德市| 常熟市| 北流市| 青铜峡市| 池州市| 英吉沙县| 库车县| 重庆市| 成武县| 泽州县| 珲春市| 安多县| 海口市| 沙洋县| 钦州市| 桐城市| 平江县| 自治县| 荣成市|