日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基类的析构函数为什么要设置成virtual

發布時間:2023/11/28 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基类的析构函数为什么要设置成virtual 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天在一場面試過程中碰到這個問題,當時一時片刻沒有反應過來,一頭霧水。只記得自己回到說,是會造成內存泄露,但面試窮追猛打,一直追問為什么造成內存泄露,還給舉例說明,一般情況下是不會造成內存泄露的,搞得場面很尷尬。回來后,心有不甘,上機看看到底存在不存在這個問題。

#include <iostream>
using namespace std;class Base
{public:Base(){cout<<"Base::Base"<<endl;};~Base(){cout<<"Base::~Base"<<endl;}    
};class Derived : public Base
{public:Derived():Base(){cout<<"Derived::Derived"<<endl;buf = new char[1024];}~Derived() {cout<<"Derived::~Derived"<<endl;delete[] buf;           }private:char* buf;
};int main()
{Base* a = new Derived();delete a;return 0;
}

運行結果

Base::Base
Derived::Derived
Base::~Base

果然沒有釋放掉繼承類的析構函數,好了。當我把基類的析構函數改為virtual的情況又如何呢?

#include <iostream>
using namespace std;class Base
{public:Base(){cout<<"Base::Base"<<endl;};virtual ~Base(){cout<<"Base::~Base"<<endl;}    
};class Derived : public Base
{public:Derived():Base(){cout<<"Derived::Derived"<<endl;buf = new char[1024];}~Derived() {cout<<"Derived::~Derived"<<endl;delete[] buf;           }private:char* buf;
};int main()
{Base* a = new Derived();delete a;return 0;
}

運行結果

Base::Base
Derived::Derived
Derived::~Derived
Base::~Base

結論

為什么會是這樣呢? 先補充一個知識, 派生類構造函數和析構函數都會調用基類的構造函數和析構函數,而且順序是基類的構造函數先調用,析構的時候基類的析構函數最后調用,從上面例子輸出中也能看出來。 還有最重要的一點就是virtual就是為多態準備的,只有加上virtual的聲明的函數,才能實現多態特性,對普通函數我們很好理解,但對于特殊的函數比如析構函數,也是一樣的,只不過它不是同名函數,但具有的性質是一樣的。

總結

以上是生活随笔為你收集整理的基类的析构函数为什么要设置成virtual的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。