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

淺談C++基類的析構(gòu)函數(shù)為虛函數(shù)

 更新時間:2015年10月04日 13:55:37   投稿:hebedich  
本文重點:應(yīng)該為多態(tài)基類聲明虛析構(gòu)器。一旦一個類包含虛函數(shù),它就應(yīng)該包含一個虛析構(gòu)器。如果一個類不用作基類或者不需具有多態(tài)性,便不應(yīng)該為它聲明虛析構(gòu)器。

1、原因:

   在實現(xiàn)多態(tài)時, 當(dāng)用基類指針操作派生類, 在析構(gòu)時候防止只析構(gòu)基類而不析構(gòu)派生類。

2、例子:

  (1)、

  
  #include<iostream>
  using namespace std;

  class Base{
  public:
     Base() {};
    ~Base() {cout << "Output from the destructor of class Base!" << endl;};

    void DoSomething() { cout << "Do something in class Base!" << endl; };
  };

  class Derived : public Base{
  public:
     Derived() {};
    ~Derived() { cout << "Output from the destructor of class Derived!" << endl; };

    void DoSomething() { cout << "Do something in class Derived!" << endl; };
  };
  int  main(){ 
     Derived* p = new Derived;
     p->DoSomething();
     delete p;
     return 0;
   }

  運行結(jié)果:

  Do something in class Derived!           

  Output from the destructor of class Derived!

  Output from the destructor of class Base! 

  代碼中基類的析構(gòu)函數(shù)不是虛函數(shù),在main函數(shù)中用繼承類的指針去操作繼承類的成員,釋放指針P的過程是:先釋放繼承類的資源,再釋放基類資源。

  (2)、

   #include<iostream>
  using namespace std;

  class Base{
  public:
     Base() {};
    ~Base() {cout << "Output from the destructor of class Base!" << endl;};

    void DoSomething() { cout << "Do something in class Base!" << endl; };
  };

  class Derived : public Base{
  public:
     Derived() {};
    ~Derived() { cout << "Output from the destructor of class Derived!" << endl; };

    void DoSomething() { cout << "Do something in class Derived!" << endl; };
  };
  int  main(){ 
     Base* p = new Derived;
     p->DoSomething();
     delete p;
     return 0;
   }

    運行結(jié)果:

    Do something in class ClxBase!
    Output from the destructor of class ClxBase!

      代碼中基類的析構(gòu)函數(shù)同樣不是虛函數(shù),不同的是在main函數(shù)中用基類的指針去操作繼承類的成員,釋放指針P的過程是:只釋放基類的資源,而沒有調(diào)用繼承類的析構(gòu)函數(shù)。 調(diào)用DoSomething()函數(shù)執(zhí)行的也是基類定義的函數(shù)。

      一般情況下,這樣的刪除只能夠刪除基類對象,而不能刪除子類對象,形成了刪除一半形象,造成內(nèi)存泄漏。

      在公有繼承中,基類對派生類及其對象的操作,只能影響到那些從基類繼承下來的成員。如果想要用基類對非繼承成員進(jìn)行操作,則要把基類的這個函數(shù)定義為虛函數(shù)。 析構(gòu)函數(shù)自然也應(yīng)該如此:如果它想析構(gòu)子類中的重新定義或新的成員及對象,當(dāng)然也應(yīng)該聲明為虛的。

  ?。?)、

  #include<iostream>
  using namespace std;

  class Base{
  public:
     Base() {};
    virtual ~Base() {cout << "Output from the destructor of class Base!" << endl;};

    virtual void DoSomething() { cout << "Do something in class Base!" << endl; };
  };

  class Derived : public Base{
  public:
     Derived() {};
    ~Derived() { cout << "Output from the destructor of class Derived!" << endl; };

    void DoSomething() { cout << "Do something in class Derived!" << endl; };
  };
  int  main(){ 
     Base* p = new Derived;
     p->DoSomething();
     delete p;
     return 0;
   }

  運行結(jié)果:

    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!
    Output from the destructor of class ClxBase!

    代碼中基類的析構(gòu)函數(shù)被定義為虛函數(shù),在main函數(shù)中用基類的指針去操作繼承類的成員,釋放指針P的過程是:釋放了繼承類的資源,再調(diào)用基類的析構(gòu)函數(shù)。調(diào)用DoSomething()函數(shù)執(zhí)行的也是繼承類定義的函數(shù)。

3、總結(jié):

  基類指針可以指向派生類的對象(多態(tài)性),如果刪除該指針delete p;就會調(diào)用該指針指向的派生類析構(gòu)函數(shù),而派生類的析構(gòu)函數(shù)又自動調(diào)用基類的析構(gòu)函數(shù),這樣整個派生類的對象完全被釋放。如果析構(gòu)函數(shù)不被聲明成虛函數(shù),則編譯器實施靜態(tài)綁定,在刪除基類指針時,只會調(diào)用基類的析構(gòu)函數(shù)而不調(diào)用派生類析構(gòu)函數(shù),這樣就會造成派生類對象析構(gòu)不完全。所以,將析構(gòu)函數(shù)聲明為虛函數(shù)是十分必要的。

相關(guān)文章

  • C語言大小端模式、判斷大小端、大小端轉(zhuǎn)換方法詳解

    C語言大小端模式、判斷大小端、大小端轉(zhuǎn)換方法詳解

    這篇文章主要介紹了C語言大小端模式、判斷大小端、大小端轉(zhuǎn)換的相關(guān)資料,大端和小端是數(shù)據(jù)在內(nèi)存中的存儲方式,大端模式下高字節(jié)存于低地址,小端模式則相反,大小端問題由數(shù)據(jù)類型多字節(jié)存儲引起,不同選擇形成不同存儲模式,需要的朋友可以參考下
    2024-10-10
  • 詳解C++純虛函數(shù)與抽象類

    詳解C++純虛函數(shù)與抽象類

    這篇文章主要介紹了C++純虛函數(shù)與抽象類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • undefined reference to `SetPduPowerConsumptionCnt''錯誤的解決方法

    undefined reference to `SetPduPowerConsumptionCnt''錯誤的解決方法

    編譯時出現(xiàn)undefined reference to `SetPduPowerConsumptionCnt'錯誤要如何解決呢?有沒有什么好的解決方法?下面小編就為大家解答吧,如果你也遇到了這種情況,可以過來參考下
    2013-07-07
  • C語言快速掌握位段使用

    C語言快速掌握位段使用

    位段位段的聲明和結(jié)構(gòu)是類似的,但是也會有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • C++設(shè)計模式之命令模式

    C++設(shè)計模式之命令模式

    這篇文章主要介紹了C++設(shè)計模式之命令模式,本文講解了什么是命令模式、命令模式的使用場合等內(nèi)容,并給出了一個代碼實例,需要的朋友可以參考下
    2014-10-10
  • 最短時間學(xué)會基于C++實現(xiàn)DFS深度優(yōu)先搜索

    最短時間學(xué)會基于C++實現(xiàn)DFS深度優(yōu)先搜索

    常見使用深度優(yōu)先搜索(DFS)以及廣度優(yōu)先搜索(BFS)這兩種搜索,今天我們就來講講什么是深度優(yōu)先搜索,感興趣的可以了解一下
    2021-08-08
  • C語言實現(xiàn)的猴子偷桃之類算法

    C語言實現(xiàn)的猴子偷桃之類算法

    本文給大家分享的是前些日子去面試的時候的試題,哎,真是沒想到會出這么個題,好多年沒碰過C了。。。。分享給大家,小伙伴們過來參觀下吧。
    2015-03-03
  • C語言文件操作詳情(二)

    C語言文件操作詳情(二)

    這篇文章主要介紹了C語言文件操作詳情,文章基于上一篇文章的內(nèi)容繼續(xù)展開C語言文件操作的相關(guān)詳情,需要的小伙伴可以參考一下
    2022-04-04
  • C語言實現(xiàn)三子棋

    C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言深入分析浮點型數(shù)據(jù)存儲

    C語言深入分析浮點型數(shù)據(jù)存儲

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08

最新評論

扎兰屯市| 酒泉市| 长乐市| 江山市| 吉隆县| 阿克陶县| 航空| 综艺| 东乌珠穆沁旗| 普洱| 澄江县| 涞水县| 视频| 南江县| 镇平县| 徐水县| 遂溪县| 新昌县| 廊坊市| 隆安县| 葫芦岛市| 富平县| 婺源县| 永德县| 井冈山市| 宜良县| 黎平县| 阜城县| 巢湖市| 信宜市| 凤山市| 丹巴县| 博湖县| 社会| 金门县| 湘西| 温宿县| 尼勒克县| 友谊县| 玉环县| 宁化县|