析構函式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...