C++虛解構函式的流量分析

來源:互聯網
上載者:User

在C++中,不能聲明虛建構函式,但可以聲明虛解構函式。多態性是指不同的對象對同一訊息有不同的行為特性。虛函數作為運行時多態性的基礎,主要是針對對象的,而建構函式是在對象產生之前啟動並執行,因此虛建構函式是沒有意義的。
解構函式的功能是在該類對象消亡之前進行一些必要的清理工作,解構函式最好都是virtual的。
首先解釋一下虛構函數和指標之間是如何互動的,以及虛解構函式的具體含義。例如以下代碼,其中SomeClass是含有非virtual解構函式的一個類:
SomeClass *p= new SomeClass;
. . . . . .
delect p;
為p調用delect時,會自動調用SomeClass類的解構函式。現在,再來看看將解構函式標記為virtual之後,會發生什麼事情。
描述解構函式與虛函數機制的互動時,最簡單的表述是:將所有解構函式都視為具有相同的名字(即使它們並非真的同名)。例如,假定Derived類是Base類的一個衍生類別,並假定Base類中的解構函式標記為virtual。現在來分析以下代碼:
Base *pBase= new Derived;
. . . . . .
delect pBase;
為Base調用delect時,會調用一個解構函式。由於Base類中的解構函式標記為virtual,而且指向的對象屬於Derived類型,所以會調用Derived類中的解構函式。
應注意的一點是,將解構函式標記為virtual後,衍生類別所有的解構函式都自動成為virtual的(不管時候用virtual來標記它們)。同樣地,這種行為就好象所有解構函式都具有相同的名字(即使事實上不同名)。
下面說的是將所有解構函式都標記為virtual的好處。假定Base類有一個指標類型的成員變數pB,Base類的建構函式會建立由pB指向的一個動態變數,而Base類的解構函式會刪除pB指向的動態變數。另外,假定Base類沒有標記為virtual,並假定Derived類(它從Base派生)有一個指標類型的成員變數pD,Derived類的建構函式會建立有pD指向的一個動態變數,而Derived類的解構函式會刪除pD指向的動態變數。分析一下以下代碼:
Base *pBase= new Derived;
. . . . . .
delect pBase;
由於基類中的解構函式沒有標記為virtual,所以只會調用Base類的解構函式。它會將pB指向的動態變數佔用的記憶體返還給自由儲存。但是,對於pD指向的動態變數來說,它佔用的記憶體永遠不會返還給自由儲存(除非程式終止)。
另一方面,如果基類Base的解構函式標記為virtual,那麼為pBase調用delect時,就會調用Derived類的解構函式(因為指向的對象屬於Derived類型)。Derived類的解構函式會刪除pD指向的動態變數,再自動調用基類Base的解構函式。後者會刪除pB指向的動態變數。因此,將基類解構函式標記為virtual之後,所有記憶體都能成功地由自由儲存回收。為了準備好迎接這種情況,最好總是將解構函式標記為virtual。
舉個例子說明一下: 複製代碼 代碼如下:#include "stdafx.h"
#include <iostream>
using namespace std;
class Base
{
public:
Base(){cout << " Constructor in Base. " << endl;}
virtual ~Base(){ cout << " Destructor in Base. " << endl;}
};
class Derived:public Base
{
public:
Derived(){cout << " Constructor in Derived. " << endl;}
~Derived(){cout << "Destructor in Derived. " << endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Base *p = new Derived;
delete p;
return 0;
}

輸出:
Constructor in Base.
Constructor in Derived.
Destroctor in Derived.
Destroctor in Base.

如果Base中的解構函式,沒有virtual修飾,輸出為:
Constructor in Base.
Constructor in Derived.
Destroctor in Base.
這樣子類Derived中的解構函式沒有執行,會造成記憶體泄露,因此,如果一個類是其他類的基類,應該將其解構函式聲明為虛解構函式。另外從本例中也可以看出,建構函式、解構函式的執行順序。建構函式,先基類後子類,解構函式,先子類,後基類。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.