基类的析构函数为什么要设置成virtual
生活随笔
收集整理的這篇文章主要介紹了
基类的析构函数为什么要设置成virtual
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天在一場面試過程中碰到這個問題,當時一時片刻沒有反應過來,一頭霧水。只記得自己回到說,是會造成內存泄露,但面試窮追猛打,一直追問為什么造成內存泄露,還給舉例說明,一般情況下是不會造成內存泄露的,搞得場面很尷尬?;貋砗?#xff0c;心有不甘,上機看看到底存在不存在這個問題。
#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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: /etc/profile ,/etc/b
- 下一篇: 经典笔试上机考题-表达式求值