在c++中如何阻止類被繼承

來源:互聯網
上載者:User

這個話題是源自於一個面試題,我在網上查了一下有不少這方面的解說!我自己整理了一下,選擇了一個自認為是最優方案!
我們從最簡單的開始:
首先,大家都知道要阻止類被執行個體化,可以通過使用private or protected 關鍵字來聲明預設建構函式。那麼在阻止類被繼承的時候,我們需要用到這個技巧。其次,阻止類被繼承還需要使用private來控制繼承的基類。

namespace SamplePrivate
{

#ifdef NDEBUG

    class Sealed
    {
        protected:
            Sealed() {};

            friend class SampleSealedClass; // 設定友類,以便訪問Sealed的建構函式
    };

    class SampleSealedClass : private virtual Sealed
    {
    };

    
#else
    class SampleSealedClass {}
#endif

}

這樣我們就可以執行個體化SampleSealedClass,並且還不用擔心被繼承了。不過還是要解釋一下為什麼阻止了繼承?
當我們寫出下面的代碼時,編譯器在編譯過程中做了什麼呢?class subclass : public SampleSealedClass
{
};

首先,當你在執行個體化subclass的時候,會先調用SampleSealedClass的建構函式,而在這之前會調用Sealed類的預設建構函式,但是我們發現Sealed是不能被執行個體化的,並且通過private virtual的繼承只能被SampleSealedClass調用,因此這很好的阻止了類被繼承。但是這裡我們只能完成一個類被不被繼承,那麼是否有更好的方法來實現阻止任意類被繼承呢?
那就需要用到模板了:#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建構函式的能力。不過這段代碼在GCC4.0中通過編譯,而在vs2008中不能通過。可以向下面這樣來引用:class subclass : BaseSealed<subclass>
{
    public:
        subclass() { cout << "subclass" << endl; }
};

// 下面這個會編譯失敗
class ssubclass : public subclass
{
    public:
        ssubclass() { cout << "ssubclass" << endl; }
};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.