日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++对象模型-虚拟析构函数

發(fā)布時(shí)間:2025/3/21 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++对象模型-虚拟析构函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

看《inside the c++ object model》第二章,匯總一下一些知識點(diǎn)

( 轉(zhuǎn)自:http://www.cppblog.com/aaxron/archive/2010/12/23/137293.html)

作為通常原則,如果一個(gè)類定義了虛函數(shù),那么它的析構(gòu)函數(shù)就應(yīng)該定義成虛函數(shù)。因?yàn)槎x了虛函數(shù)則意味著這個(gè)類會(huì)被繼承,并且會(huì)通過基類的指針指向子類,從而得到多態(tài)。因此,基類的析構(gòu)函數(shù)是否為虛函數(shù)將決定子類的對象是否被析構(gòu)。

很多時(shí)候只能獲得基類的指針,但是并不知道它實(shí)際上是哪一個(gè)類,這時(shí)候刪除基類指針的時(shí)候,析構(gòu)函數(shù)就很有用了,如以下代碼:

?

  • #include <iostream>

  • using namespace std;

  • struct A

  • {

  • A(){cout << "A::()"<<endl;}

  • virtual ~A() {cout<<"~A()\n";}

  • };

  • ?
  • struct B: public A

  • {

  • B(){cout << "B::()"<<endl;}

  • ~B() {cout<<"~B()\n";}

  • };

  • ?
  • int main()

  • {

  • A* p = new B;

  • delete p;

  • //B b;

  • return 0;

  • }


  • 如果A的析構(gòu)函數(shù)不是virtual,那么輸出的就是~A();

    如果A的析構(gòu)函數(shù)是virtual,那么刪除p的時(shí)候,實(shí)際上是調(diào)用B的析構(gòu)函數(shù),因此會(huì)首先調(diào)用b的析構(gòu)函數(shù),然后再調(diào)用A的析構(gòu)函數(shù),輸出的結(jié)果是:

    ~B();

    ~A();

    類如果會(huì)被派生,一般都會(huì)采用析構(gòu)函數(shù),不是防止內(nèi)存泄露,而是為了正確的析構(gòu)。如果是個(gè)封閉類,那么就不要定義virtual,因此虛函數(shù)的代價(jià)比較大。

    不用virtual的幾種情況:

    1.作為非公共基類。僅作為private base class不需要使用虛擬析構(gòu)函數(shù)。

    2.不作為接口使用的基類、

    3.如果你可以保證這個(gè)類不被public繼承(private/protected繼承的話,在非friend函數(shù)/類中就無法用基類指針指向派生類了)?

    4.如果它的所有派生類(包括派生類的派生類)的析構(gòu)函數(shù)都是trivial的(這里的trivial指的是在程序員的層次什么事也不做)?

    5.?如果不需要用基類的指針指向派生類的對象

    ?

    在這五種情況下,不把析構(gòu)函數(shù)聲明為virtual都是可以的,何況效率會(huì)高一些——但前提是你得保證前提的成立——不過這些保證常常是很難100%。誰能保證別人在派生你的類的時(shí)候,析構(gòu)函數(shù)是trivial的,或者別人不用你提供的基類的指針指向派生類對象?這些常常是很難得到保證的。??

    聲明基類的析構(gòu)函數(shù)為virtual并非總是為了防止memory?? leak?? 另外這也只是作為一般的原則(基類中有虛函數(shù)則把其析構(gòu)函數(shù)聲明為virtual)。如果你的析構(gòu)函數(shù)什么事也不作,從效果上來說,不聲明為virtual也無妨

    總結(jié)

    以上是生活随笔為你收集整理的c++对象模型-虚拟析构函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。