欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年09月28日 10:31:24   作者:moonz-wu  
這篇文章主要介紹了在C++中如何阻止類被繼承,對于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++ namespace相關(guān)語法實例分析

    C++ namespace相關(guān)語法實例分析

    這篇文章主要介紹了C++ namespace相關(guān)語法實例分析,對C++初學者有很好的參考借鑒價值,需要的朋友可以參考下
    2014-08-08
  • VC++ 中ListCtrl經(jīng)驗總結(jié)

    VC++ 中ListCtrl經(jīng)驗總結(jié)

    這篇文章主要介紹了VC++ 中ListCtrl經(jīng)驗總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++ Boost命令行解析庫的應用詳解

    C++ Boost命令行解析庫的應用詳解

    命令行解析庫是一種用于簡化處理命令行參數(shù)的工具,它可以幫助開發(fā)者更方便地解析命令行參數(shù)并提供適當?shù)膸椭畔?本文主要介紹了不同的命令行解析庫和它們在C++項目中的應用,希望對大家有所幫助
    2023-11-11
  • 淺談分詞器Tokenizer

    淺談分詞器Tokenizer

    分詞器的工作就是分解文本流成詞(tokens).在這個文本中,每一個token都是這些字符的一個子序列。一個分析器(analyzer)必須知道它所配置的字段,但是tokenizer不需要,分詞器(tokenizer)從一個字符流(reader)讀取數(shù)據(jù),生成一個Token對象(TokenStream)的序列
    2021-06-06
  • Qt之實現(xiàn)圓形進度條的示例代碼

    Qt之實現(xiàn)圓形進度條的示例代碼

    在平時做頁面開發(fā)時,有些時候會用到圓形進度條,本文主要介紹了Qt之實現(xiàn)圓形進度條的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計

    C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 淺談C++為什么非要引入那幾種類型轉(zhuǎn)換

    淺談C++為什么非要引入那幾種類型轉(zhuǎn)換

    這篇文章主要介紹了C++為什么非要引入那幾種類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 詳解如何用c++實現(xiàn)平衡二叉樹

    詳解如何用c++實現(xiàn)平衡二叉樹

    平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別于AVL算法),由前蘇聯(lián)的數(shù)學家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉樹,根據(jù)科學家的英文名也稱為AVL樹。本文介紹了它的原理和如何用C++代碼來實現(xiàn)
    2021-06-06
  • 基于條件變量的消息隊列 說明介紹

    基于條件變量的消息隊列 說明介紹

    本篇文章小編為大家介紹,基于條件變量的消息隊列 說明介紹。需要的朋友參考一下
    2013-04-04
  • C++ 指向類成員的指針

    C++ 指向類成員的指針

    指向類成員的指針總的來講可以分為兩大類四小類(指向數(shù)據(jù)成員還是成員函數(shù),指向普通成員還是靜態(tài)成員)
    2020-03-03

最新評論