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

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ù)會自動調(diào)用父類的構(gòu)造函數(shù)。同樣,子類的析構(gòu)函數(shù)也會自動調(diào)用父類的析構(gòu)函數(shù)。要想一個(gè)類不能被繼承,只要把它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都定義為私有函數(shù)。那么當(dāng)一個(gè)類試圖從它那繼承的時(shí)候,必然會由于試圖調(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ù)都不會造成編譯錯(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í)候,會直接跳過FinalClass2而直接調(diào)用MakeFinal<FinalClass2>的構(gòu)造函數(shù)。非常遺憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能調(diào)用其私有的構(gòu)造函數(shù)。

基于上面的分析,試圖從FinalClass2繼承的類,一旦實(shí)例化,都會導(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++?反匯編之關(guān)于Switch語句的優(yōu)化措施

    C++?反匯編之關(guān)于Switch語句的優(yōu)化措施

    這篇文章主要介紹了C++?反匯編之關(guān)于Switch語句的優(yōu)化措施,利用三種優(yōu)化來降低樹高度,誰的效率高就優(yōu)先使用誰,三種優(yōu)化都無法匹配才會使用判定樹,具體內(nèi)容詳情跟隨小編一起看看吧
    2022-01-01
  • C語言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    C語言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    這篇文章主要介紹了C語言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之?dāng)U展字符詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之?dāng)U展字符詳解

    掌握C語言數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵在于理解其核心概念,擴(kuò)展字符作為其中的重要一環(huán),對于編程人員來說至關(guān)重要,本指南將為您深入剖析擴(kuò)展字符的相關(guān)知識,帶您輕松掌握C語言數(shù)據(jù)結(jié)構(gòu),讓我們一起探索這個(gè)令人著迷的領(lǐng)域吧!
    2024-03-03
  • C++函數(shù)pyrUp和pyrDown來實(shí)現(xiàn)圖像金字塔功能

    C++函數(shù)pyrUp和pyrDown來實(shí)現(xiàn)圖像金字塔功能

    這篇文章主要介紹了C++函數(shù)pyrUp和pyrDown來實(shí)現(xiàn)圖像金字塔功能,如何使用OpenCV函數(shù) pyrUp 和 pyrDown 對圖像進(jìn)行向上和向下采樣,需要的朋友可以參考下
    2017-03-03
  • Visual?Studio?2022編譯C++20代碼

    Visual?Studio?2022編譯C++20代碼

    本文主要介紹了Visual?Studio?2022編譯C++20代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • QT Creator+OpenCV實(shí)現(xiàn)圖像灰度化的示例代碼

    QT Creator+OpenCV實(shí)現(xiàn)圖像灰度化的示例代碼

    這篇文章主要為大家詳細(xì)介紹了QT如何利用Creator和OpenCV實(shí)現(xiàn)圖像灰度化效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12
  • C語言結(jié)構(gòu)體內(nèi)存對齊詳解

    C語言結(jié)構(gòu)體內(nèi)存對齊詳解

    大家好,本篇文章主要講的是C語言結(jié)構(gòu)體內(nèi)存對齊詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++淺析析構(gòu)函數(shù)的特征

    C++淺析析構(gòu)函數(shù)的特征

    既然在創(chuàng)建對象時(shí)有構(gòu)造函數(shù)(給成員初始化),那么在銷毀對象時(shí)應(yīng)該還有一個(gè)清除成員變量數(shù)據(jù)的操作咯,析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對象的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時(shí)會自動調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作
    2022-07-07
  • 數(shù)組循環(huán)移位操作實(shí)例

    數(shù)組循環(huán)移位操作實(shí)例

    這篇文章介紹了數(shù)組循環(huán)移位操作實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • 用C語言來實(shí)現(xiàn)一個(gè)簡單的虛擬機(jī)

    用C語言來實(shí)現(xiàn)一個(gè)簡單的虛擬機(jī)

    這篇文章主要介紹了用C語言來實(shí)現(xiàn)一個(gè)簡單的虛擬機(jī),其中棧數(shù)組的部分非常值得學(xué)習(xí),需要的朋友可以參考下
    2015-07-07

最新評論

鄂伦春自治旗| 百色市| 梧州市| 淮北市| 栾城县| 错那县| SHOW| 咸丰县| 文化| 毕节市| 都安| 襄城县| 临邑县| 休宁县| 五原县| 东乡县| 临邑县| 政和县| 安吉县| 都安| 防城港市| 来安县| 双流县| 新民市| 屏南县| 淮阳县| 沙湾县| 视频| 清流县| 定安县| 巴林左旗| 鹤庆县| 丰宁| 绵阳市| 阳春市| 卓尼县| 五峰| 富蕴县| 法库县| 亳州市| 珲春市|