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

C++設(shè)計(jì)類不能被繼承的方法實(shí)例講解

 更新時(shí)間:2013年12月03日 15:21:23   作者:  
在Java 中定義了關(guān)鍵字final,被final修飾的類不能被繼承,C++中如何實(shí)現(xiàn),下面我們來看一個(gè)例子

首先想到的是在C++中,子類的構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)。同樣,子類的析構(gòu)函數(shù)也會(huì)自動(dòng)調(diào)用父類的析構(gòu)函數(shù)。要想一個(gè)類不能被繼承,只要把它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都定義為私有函數(shù)。那么當(dāng)一個(gè)類試圖從它那繼承的時(shí)候,必然會(huì)由于試圖調(diào)用構(gòu)造函數(shù)、析構(gòu)函數(shù)而導(dǎo)致編譯錯(cuò)誤。

可是這個(gè)類的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有函數(shù)了,怎樣才能得到該類的實(shí)例呢?可以通過定義靜態(tài)來創(chuàng)建和釋放類的實(shí)例。基于這個(gè)思路,可以寫出如下的代碼:

復(fù)制代碼 代碼如下:

///////////////////////////////////////////////////////////////////////
// Define a class which can't be derived from
///////////////////////////////////////////////////////////////////////
class FinalClass1
{
public :
      static FinalClass1* GetInstance()
      {
            return new FinalClass1;
      }

      static void DeleteInstance( FinalClass1* pInstance)
      {
            delete pInstance;
            pInstance = 0;
      }

private :
      FinalClass1() {}
      ~FinalClass1() {}
};

這個(gè)類是不能被繼承,但在總覺得它和一般的類有些不一樣,使用起來也有點(diǎn)不方便。比如,只能得到位于堆上的實(shí)例,而得不到位于棧上實(shí)例。

能不能實(shí)現(xiàn)一個(gè)和一般類除了不能被繼承之外其他用法都一樣的類呢?辦法總是有的,不過需要一些技巧。請看如下代碼:

復(fù)制代碼 代碼如下:

///////////////////////////////////////////////////////////////////////
// Define a class which can't be derived from
///////////////////////////////////////////////////////////////////////
template <typename T>
class MakeFinal
{
      friend T;

private :
      MakeFinal() {}
      ~MakeFinal() {}
};

class FinalClass2 : virtual public MakeFinal<FinalClass2>
{
public :
      FinalClass2() {}
      ~FinalClass2() {}
};

這個(gè)類使用起來和一般的類沒有區(qū)別,可以在棧上、也可以在堆上創(chuàng)建實(shí)例。盡管類MakeFinal<FinalClass2>的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有的,但由于類FinalClass2是它的友元函數(shù),因此在FinalClass2中調(diào)用MakeFinal<FinalClass2>的構(gòu)造函數(shù)和析構(gòu)函數(shù)都不會(huì)造成編譯錯(cuò)誤。

但當(dāng)試圖從FinalClass2繼承一個(gè)類并創(chuàng)建它的實(shí)例時(shí),卻不同通過編譯。

復(fù)制代碼 代碼如下:

class Try : public FinalClass2
{
public :
      Try() {}
      ~Try() {}
};

Try temp;

由于類FinalClass2是從類MakeFinal<FinalClass2>虛繼承過來的,在調(diào)用Try的構(gòu)造函數(shù)的時(shí)候,會(huì)直接跳過FinalClass2而直接調(diào)用MakeFinal<FinalClass2>的構(gòu)造函數(shù)。非常遺憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能調(diào)用其私有的構(gòu)造函數(shù)。

基于上面的分析,試圖從FinalClass2繼承的類,一旦實(shí)例化,都會(huì)導(dǎo)致編譯錯(cuò)誤,因此是FinalClass2不能被繼承。這就滿足了設(shè)計(jì)要求。

C++11中已經(jīng)有了final關(guān)鍵字:它的作用是指定類的虛函數(shù)不能被該類的繼承類重寫(override),或者是指定一個(gè)類成為一個(gè)不能被繼承的類(final class)。

復(fù)制代碼 代碼如下:

struct A
{
    virtual void foo() final;
};

struct B final : A
{
    void foo(); // Error: foo cannot be overridden as it's final in A
};

struct C : B // Error: B is final
{
};

相關(guān)文章

  • C語言小程序 數(shù)組操作示例代碼

    C語言小程序 數(shù)組操作示例代碼

    對數(shù)組進(jìn)行操作,查找、插入、刪除
    2013-07-07
  • C++詳細(xì)講解引用類型

    C++詳細(xì)講解引用類型

    引用指的是對一個(gè)對象的引用。那么什么是對象?在c++中狹義的對象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來聲明的變量,如?MyClass?myclass,CDialog?mydlg,等等
    2022-07-07
  • 基于C語言航班信息查詢與檢索

    基于C語言航班信息查詢與檢索

    這篇文章主要為大家詳細(xì)介紹了基于C語言航班信息查詢與檢索,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法

    C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法

    這篇文章主要介紹了C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C語言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    C語言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。本文將用C語言實(shí)現(xiàn)這一經(jīng)典游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • C++?和?C#?中的?lambda的方法技巧

    C++?和?C#?中的?lambda的方法技巧

    這篇文章主要介紹了C++?和?C#?中的?lambda的方法技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++ map索引不存在的key可能導(dǎo)致的后果分析

    c++ map索引不存在的key可能導(dǎo)致的后果分析

    這篇文章主要介紹了c++ map索引不存在的key可能導(dǎo)致的后果分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 通過代碼實(shí)例解析c++ vector常用方法

    通過代碼實(shí)例解析c++ vector常用方法

    這篇文章主要介紹了通過代碼實(shí)例解析c++ vector常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 基于C++實(shí)現(xiàn)職工管理系統(tǒng)

    基于C++實(shí)現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論