欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

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

復(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è)類(lèi)是不能被繼承,但在總覺(jué)得它和一般的類(lèi)有些不一樣,使用起來(lái)也有點(diǎn)不方便。比如,只能得到位于堆上的實(shí)例,而得不到位于棧上實(shí)例。

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

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

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

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

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

Try temp;

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

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

C++11中已經(jīng)有了final關(guān)鍵字:它的作用是指定類(lèi)的虛函數(shù)不能被該類(lèi)的繼承類(lèi)重寫(xiě)(override),或者是指定一個(gè)類(lèi)成為一個(gè)不能被繼承的類(lèi)(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
{
};

上一篇:C++訪問(wèn)注冊(cè)表獲取已安裝軟件信息列表示例代碼

欄    目:C語(yǔ)言

下一篇:c語(yǔ)言中使用BF-KMP算法實(shí)例

本文標(biāo)題:C++設(shè)計(jì)類(lèi)不能被繼承的方法實(shí)例講解

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3885.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有