程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> virtual析構函數的作用,virtual函數

virtual析構函數的作用,virtual函數

編輯:C++入門知識

virtual析構函數的作用,virtual函數


C++ Primter中講“在 C++ 中,基類必須指出希望派生類重寫哪些函數,定義為 virtual 的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數”。

 

析構函數是為了在對象不被使用之後釋放它的資源,虛函數是為了實現多態。那麼把析構函數聲明為vitual有什麼作用呢?,下面通過例子來說明一下vitual的用途。

using namespace std;

class Base
{
public:
  Base() {};     //Base的構造函數
  ~Base()        //Base的析構函數
  {
    cout << "the destructor of class Base!" << endl;
  };
  virtual void DoSomething() 
  {
    cout << "Do something in class Base!" << endl;
  };
};
    
class Derived : public Base
{
public:
  Derived() {};     //Derived的構造函數
  ~Derived()      //Derived的析構函數
  {
    cout << "the destructor of class Derived!" << endl;
  };
  void DoSomething()
  {
    cout << "Do something in class Derived!" << endl;
  };
};
    
int main()
{
  Derived *pTest1 = new Derived();   //Derived類的指針
  pTest1->DoSomething();
  delete pTest1;
    
  cout << endl;
    
  Base *pTest2 = new Derived();      //Base類的指針
  pTest2->DoSomething();
  delete pTest2;
    
  return 0;
}


先看程序輸出結果:
1       Do something in class Derived!
2       the destructor of class Derived!
3       the destructor of class Base!
4      
5       Do something in class Derived!
6       the destructor of class Base!

從運行結果來看,pTest1運行比較正常,也好理解,pTest2運行了子類的Do something和父類的析構函數,並沒有運行子類的析構函數,這樣會造成內存洩漏。

pTest2運行了子類的Do something量因為父類的Do something加了virtual。

pTest2運行了父類的析構函數是因為父類的析構函數並沒有加virtual,所以它並不會運行子類的析構函數。

如果Base的析構函數加上virtual,那麼pTest1和pTest2運行過程一樣。

總結:如果一個類有可能會被繼承,那麼它的析構函數最好加上virtual,不然出現內存洩漏問題找都找不到。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved