析構函式virtual與非virtual區別

2021-05-23 07:20:17 字數 1174 閱讀 9953

析構函式virtual與非virtual區別

作為通常的原則,如果乙個類定義了虛函式,那麼它的析構函式就應當是virtual的。因為定義了虛函式則隱含著:這個類會被繼承,並且會通過基類的指標指向子類物件,從而得到多型性。   這個類可能會被繼承,並且會通過基類的指標指向子類物件」,因此基類的析構函式是否為虛將決定子類的物件是否被析構

示例**:

<

iostream.h

>

structa;

struct

b: publica;

void

main()

如果 a的析構函式不是virtual的,那麼此時就不是先呼叫b的析構函式再呼叫a的析構函式。

output:

~a();

如果a   的析構函式為virtual,則先~b(),再~a()  

output:

~b();

~a();

類如果會被派生的話,析構函式一般都應該定義為virtual的,主要不是防止記憶體洩露,而是為了正確的析構。如果是個封閉類(即不再被派生),就不要定義為virtual的。虛函式畢竟耗費較大的。

不用virtual 的幾種情況:

1、作為非公有基類。僅作為   private   base   class   使用的   class   不需要使用虛擬析構函式  

2、不作為介面使用的基類。  

3.   如果你可以保證這個類不被public繼承(private/protected繼承的話,在非friend函式/類中就無法用基類指標指向派生類了)  

4.   如果它的所有派生類(包括派生類的派生類)的析構函式都是trivial的(這裡的trivial指的是在程式設計師的層次什麼事也不做)  

5.   如果不需要用基類的指標指向派生類的物件  

在這五種情況下,不把析構函式宣告為virtual都是可以的,何況效率會高一些——但前提是你得保證前提的成立——不過這些保證常常是很難100%的:誰能保證別人在派生你的類的時候,析構函式是trivial的,或者別人不用你提供的基類的指標指向派生類物件?這些常常是很難得到保證的。  

宣告基類的析構函式為virtual並非總是為了防止memory   leak   另外這也只是作為一般的原則(基類中有虛函式則把其析構函式宣告為virtual)。如果你的析構函式什麼事也不作,從效果上來說,不宣告為virtual也無妨

virtual析構函式

當派生類物件撤銷時,一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。include using namespace std class base class derived public base int main void 執行結果 呼叫基類base的析構函式 如果在主函式中用new運算子建...

virtual 析構函式的作用

大家知道,析構函式是為了在物件不被使用之後釋放它的資源,虛函式是為了實現多型。那麼把析構函式宣告為vitual有什麼作用呢?請看下面的 1 include 2 using namespace std 34 class base 5 base的建構函式 8 base base的析構函式 9 12 vi...

C 中virtual 析構函式

我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public clxba...