亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺談C++基類的析構函數為虛函數

2020-05-23 14:14:02
字體:
來源:轉載
供稿:網友

本文重點:應該為多態基類聲明虛析構器。一旦一個類包含虛函數,它就應該包含一個虛析構器。如果一個類不用作基類或者不需具有多態性,便不應該為它聲明虛析構器。

1、原因:

在實現多態時, 當用基類指針操作派生類, 在析構時候防止只析構基類而不析構派生類。

2、例子:

(1)、

 

  1. #include<iostream> 
  2. using namespace std; 
  3.  
  4. class Base{ 
  5. public
  6.    Base() {}; 
  7. ~Base() {cout << "Output from the destructor of class Base!" << endl;}; 
  8.  
  9. void DoSomething() { cout << "Do something in class Base!" << endl; }; 
  10. }; 
  11.  
  12. class Derived : public Base{ 
  13. public
  14.    Derived() {}; 
  15. ~Derived() { cout << "Output from the destructor of class Derived!" << endl; }; 
  16.  
  17. void DoSomething() { cout << "Do something in class Derived!" << endl; }; 
  18. }; 
  19. int main(){  
  20.    Derived* p = new Derived; 
  21.    p->DoSomething(); 
  22.    delete p; 
  23.    return 0; 

運行結果:

Do something in class Derived!

Output from the destructor of class Derived!

Output from the destructor of class Base!

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

(2)、

 

  1. #include<iostream> 
  2. using namespace std; 
  3.  
  4. class Base{ 
  5. public
  6.    Base() {}; 
  7. ~Base() {cout << "Output from the destructor of class Base!" << endl;}; 
  8.  
  9. void DoSomething() { cout << "Do something in class Base!" << endl; }; 
  10. }; 
  11.  
  12. class Derived : public Base{ 
  13. public
  14.    Derived() {}; 
  15. ~Derived() { cout << "Output from the destructor of class Derived!" << endl; }; 
  16.  
  17. void DoSomething() { cout << "Do something in class Derived!" << endl; }; 
  18. }; 
  19. int main(){  
  20.    Base* p = new Derived; 
  21.    p->DoSomething(); 
  22.    delete p; 
  23.    return 0; 

運行結果:

Do something in class ClxBase!

Output from the destructor of class ClxBase!

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

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

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

(3)、

 

 
  1. #include<iostream> 
  2. using namespace std; 
  3.  
  4. class Base{ 
  5. public
  6.    Base() {}; 
  7. virtual ~Base() {cout << "Output from the destructor of class Base!" << endl;}; 
  8.  
  9. virtual void DoSomething() { cout << "Do something in class Base!" << endl; }; 
  10. }; 
  11.  
  12. class Derived : public Base{ 
  13. public
  14.    Derived() {}; 
  15. ~Derived() { cout << "Output from the destructor of class Derived!" << endl; }; 
  16.  
  17. void DoSomething() { cout << "Do something in class Derived!" << endl; }; 
  18. }; 
  19. int main(){  
  20.    Base* p = new Derived; 
  21.    p->DoSomething(); 
  22.    delete p; 
  23.    return 0; 

運行結果:

Do something in class ClxDerived!

Output from the destructor of class ClxDerived!

Output from the destructor of class ClxBase!

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

3、總結:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲aa在线观看| 色妞在线综合亚洲欧美| 亚洲女同性videos| 国内精品国产三级国产在线专| 中文字幕精品www乱入免费视频| 欧美激情亚洲视频| 国产精品视频地址| 成人啪啪免费看| 成人网在线视频| 亚洲欧美日韩一区二区在线| 精品久久久久久久久久| 5566成人精品视频免费| 国产日韩一区在线| 国产午夜精品全部视频在线播放| 亚洲视频在线观看视频| 国产suv精品一区二区| 国产在线不卡精品| 国产精品福利在线观看| 亚洲丝袜av一区| 亚洲一区二区三区sesese| 高潮白浆女日韩av免费看| 国产精品免费看久久久香蕉| 国产精品网红直播| 国产一区欧美二区三区| 成人写真视频福利网| 亚洲电影成人av99爱色| 26uuu亚洲国产精品| 国产美女被下药99| 精品视频久久久久久| 国产成人精品一区| 亚洲午夜精品久久久久久性色| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲免费影视第一页| 丝袜一区二区三区| 中文精品99久久国产香蕉| 亚洲国产欧美一区二区三区久久| 亚洲一区二区三区sesese| 亚洲欧美日韩一区二区三区在线| 日韩欧美高清在线视频| 国产精品18久久久久久麻辣| 成人国产精品久久久久久亚洲| 欧美激情视频网| 在线亚洲国产精品网| 法国裸体一区二区| 国产精品久久久久久久久久久不卡| 欧美日韩裸体免费视频| 97视频免费观看| 久久视频精品在线| 日韩在线观看免费网站| 精品视频在线播放免| 久久亚洲私人国产精品va| 国产精品最新在线观看| 色综合久久88色综合天天看泰| 国产精品久久久91| 欧美午夜视频一区二区| 亚洲第一页自拍| 亚洲第一网站男人都懂| 国产日韩综合一区二区性色av| 一区二区日韩精品| 日韩欧美中文第一页| 国产一区二区三区视频| 欧洲成人性视频| 亚洲视频国产视频| 欧美一区二区三区四区在线| 国产精品美女免费看| 成人欧美一区二区三区在线湿哒哒| 亚洲性生活视频| 国产欧美一区二区三区在线| 亚洲永久在线观看| 亚洲色图第一页| 欧美日韩国产一区二区三区| 欧美性xxxx| 亚洲人成毛片在线播放| 成人欧美一区二区三区在线湿哒哒| 91精品国产成人| 欧美亚洲免费电影| 中文字幕成人在线| 日韩欧美在线观看| 日韩欧美在线视频| 51午夜精品视频| 亚洲成色999久久网站| 亚洲欧美制服丝袜| 亚洲天堂第一页| 国产视频精品一区二区三区| 91精品国产高清自在线看超| 亚洲毛茸茸少妇高潮呻吟| 精品偷拍一区二区三区在线看| 2018国产精品视频| 国产精品久久精品| 91精品国产高清久久久久久久久| 亚洲精品日产aⅴ| 欧美日韩国产成人高清视频| 亚洲第一视频在线观看| 亚洲石原莉奈一区二区在线观看| 日韩高清人体午夜| 91精品免费看| 人体精品一二三区| 久久综合色88| 欧美电影免费看| 97久久精品人人澡人人爽缅北| 91精品久久久久久久久久久久久| 亚洲欧美激情一区| 欧美亚洲视频在线看网址| 黑人欧美xxxx| 久久久久久久网站| 国产欧美婷婷中文| 久久露脸国产精品| 国产亚洲精品美女| 亚洲精品电影网站| 欧美一区二区三区精品电影| 欧美成人在线网站| 欧美肥臀大乳一区二区免费视频| 91av中文字幕| 欧美日韩福利电影| 欧美专区福利在线| 97碰碰碰免费色视频| 日韩av片永久免费网站| 精品爽片免费看久久| 国产精品成人国产乱一区| 精品国产福利在线| 亚洲综合国产精品| 成人www视频在线观看| 中文字幕精品av| 亚洲国产精品久久| 午夜精品视频在线| 国产精品国产自产拍高清av水多| 色综合色综合久久综合频道88| 欧美第一黄色网| 欧美整片在线观看| 日韩精品视频在线播放| 日韩大陆毛片av| 日韩欧美亚洲成人| 久久99国产精品自在自在app| 综合国产在线视频| 中文字幕在线观看日韩| 视频在线观看99| 国产精自产拍久久久久久蜜| 精品中文字幕在线观看| 欧美视频在线观看免费| 亚洲一区av在线播放| 国产精品欧美日韩一区二区| 欧美大片免费观看| 97**国产露脸精品国产| 成人免费看吃奶视频网站| 欧美成人中文字幕在线| 日韩欧美中文免费| 日韩在线视频免费观看高清中文| 97超碰蝌蚪网人人做人人爽| 日韩精品一区二区视频| 国语自产精品视频在线看一大j8| 久久久久久亚洲精品不卡| 欧美麻豆久久久久久中文| 亚洲一区二区久久久久久| 欧美激情亚洲国产| 欧美最猛性xxxxx(亚洲精品)| 精品久久久久人成| 91精品国产综合久久久久久蜜臀| 午夜精品久久久久久久男人的天堂| 国产一区二区三区毛片| 日本久久中文字幕| 91网站在线看| 啊v视频在线一区二区三区| 国产精品91在线观看| 久久精品国产一区|