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

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

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

這個(gè)話題是源自于一個(gè)面試題,我在網(wǎng)上查了一下有不少這方面的解說!我自己整理了一下,選擇了一個(gè)自認(rèn)為是最優(yōu)方案!

我們從最簡(jiǎn)單的開始:

首先,大家都知道要阻止類被實(shí)例化,可以通過使用private or protected 關(guān)鍵字來聲明默認(rèn)構(gòu)造函數(shù)。那么在阻止類被繼承的時(shí)候,我們需要用到這個(gè)技巧。其次,阻止類被繼承還需要使用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
}

這樣我們就可以實(shí)例化SampleSealedClass,并且還不用擔(dān)心被繼承了。不過還是要解釋一下為什么阻止了繼承?

當(dāng)我們寫出下面的代碼時(shí),編譯器在編譯過程中做了什么呢?

class subclass : public SampleSealedClass
{
};

首先,當(dāng)你在實(shí)例化subclass的時(shí)候,會(huì)先調(diào)用SampleSealedClass的構(gòu)造函數(shù),而在這之前會(huì)調(diào)用Sealed類的默認(rèn)構(gòu)造函數(shù),但是我們發(fā)現(xiàn)Sealed是不能被實(shí)例化的,并且通過private virtual的繼承只能被SampleSealedClass調(diào)用,因此這很好的阻止了類被繼承。但是這里我們只能完成一個(gè)類被不被繼承,那么是否有更好的方法來實(shí)現(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; }
};
// 下面這個(gè)會(huì)編譯失敗
class ssubclass : public subclass
{
    public:
        ssubclass() { cout << "ssubclass" << endl; }
};

將想法付諸于實(shí)踐,借此來影響他人是一個(gè)人存在的真正價(jià)值

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

张家界市| 新龙县| 南宁市| 平顶山市| 临安市| 伊宁县| 大名县| 泌阳县| 芮城县| 宁国市| 义乌市| 洪泽县| 池州市| 桦南县| 富裕县| 衡水市| 灯塔市| 鹿泉市| 工布江达县| 阳山县| 罗甸县| 小金县| 化州市| 酒泉市| 临桂县| 青冈县| 阜城县| 开江县| 磐安县| 临泽县| 尉氏县| 赤峰市| 志丹县| 石狮市| 新密市| 宁河县| 蕲春县| 景东| 长沙县| 进贤县| 城市|