虛析構函式和protected析構函式

2021-08-21 10:18:29 字數 1057 閱讀 4427

型別需要虛析構函式的另外乙個特徵 是該型別具有指標成員或引用成員。如果有指標成員和引用成員,則該型別通常需要實現析構函式以及拷貝操作。

通常,乙個實現了析構函式的型別同時也需要實現拷貝建構函式與拷貝複製函式。

1.如果乙個類有虛函式功能,它經常作為乙個基類使用。

2.如果它是乙個基類,它的派生類經常使用new來分配。

3.如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它的基類的指標來刪除它(如果基類沒有虛析構函式,結果將是不確定的,實際發生時,派生類的析構函式永遠不會被呼叫)。

基類有虛析構函式的話,最底層的派生類的析構函式最先被呼叫,然後各個基類的析構函式被呼叫

對於堆中的物件,我們通常用new/delete來建立/銷毀。當呼叫new時,它會自動去呼叫相應類的建構函式。同樣,當呼叫delete時,它會自動去呼叫相應類的析構函式。當我們在棧中產生物件時,前面說的過程是自動完成的。即:不需要我們顯式呼叫new/delete。這裡有個前提:類的構造/析構都是public的。

然而,當我們想禁止在棧中產生物件時,如何來實現呢?

將建構函式設為private行嗎?no!這樣物件雖然不能在棧中產生,但同樣也不能在堆中產生了。

將析構函式設為private行嗎?bad!這樣雖然限制了棧物件,但同時也限制了繼承。

將析構函式設為protected行嗎?yes!

例如:

class a 

~a()  

public:   

static a* create()   

void destroy() };

//我們可以這樣來使用它:

a* pa= a::create();

pa->destroy() ;

1、如果你不想讓外面的使用者直接構造乙個類(假設這個類的名字為a)的物件,而希望使用者只能構造這個類a的子類,那你就可以將類a的建構函式/析構函式宣告為protected,而將類a的子類的建構函式/析構函式宣告為public。

2. 如果將建構函式/析構函式宣告為private,那只能這個類的「內部」的函式才能構造這個類的物件了

C 虛析構函式和純虛析構函式

我們知道析構函式是在物件生命週期結束時自動被呼叫,用來做一些清理工作 如釋放控制代碼,釋放堆記憶體等 防止出現記憶體洩漏。那怎麼還有虛析構函式呢?使用虛析構函式的類一般是要作為基類,被其他類繼承。通過把基類的析構函式宣告為虛函式,就可以通過父類指標來釋放子類物件,從而完成子類的一些清理工作,防止出現...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...

C 虛函式,純虛函式,虛析構和純虛析構

c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...