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

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

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

1、原因:

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

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(){ 
     Derived* p = new Derived;
     p->DoSomething();
     delete p;
     return 0;
   }

  運(yùn)行結(jié)果:

  Do something in class Derived!           

  Output from the destructor of class Derived!

  Output from the destructor of class Base! 

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

 ?。?)、

   #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;
   }

    運(yùn)行結(jié)果:

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

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

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

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

  運(yùn)行結(jié)果:

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

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

3、總結(jié):

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

相關(guān)文章

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

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

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

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

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

    undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

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

    C語(yǔ)言快速掌握位段使用

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

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

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

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

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

    C語(yǔ)言實(shí)現(xiàn)的猴子偷桃之類(lèi)算法

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

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

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

    C語(yǔ)言實(shí)現(xiàn)三子棋

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

    C語(yǔ)言深入分析浮點(diǎn)型數(shù)據(jù)存儲(chǔ)

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

最新評(píng)論

高碑店市| 绥阳县| 长丰县| 山东| 阳山县| 湟源县| 雅江县| 沂南县| 安西县| 永丰县| 宝鸡市| 香港| 原阳县| 鹰潭市| 白银市| 河曲县| 惠州市| 龙州县| 桃园市| 沙田区| 清水河县| 东明县| 临夏市| 迭部县| 安康市| 永年县| 麻阳| 明光市| 鄢陵县| 六安市| 襄城县| 蓝田县| 鄂州市| 绥棱县| 同心县| 陆丰市| 明溪县| 平顺县| 红河县| 庆元县| 佛坪县|