首先,在棧裡宣告兩個物件bs、sc,看看編譯器是如何自動呼叫的。
#includeusing namespace std;
class base
~base()
執行結果顯示:
first:
construct in base
second:
construct in base
construct in subclass
說明編譯器沒有呼叫析構函式,因為指向new出來的物件的指標沒有delete,可以通過分別增加兩個delete,來釋放資源;
void main()
執行結果:
first:
consttruct in base
second:
consttruct in base
construct in subclass
destructing base
destructing subclass
destructing base
end!
當然此處也可以不通過多次delete的方式來釋放資源,另外定義乙個函式
void del(base *p)
void main()
執行後發現,其實不然,當del(sc)後,並沒有先呼叫派生類的析構函式,再呼叫基類的析構函式,而是直接呼叫了基類的建構函式,這是為什麼呢?
當傳遞sc指標給del(base *p)時,由於析構函式並沒有定義為虛函式,所以在析構時,不能夠動態繫結。
因此,應將基類的析構函式定義為虛函式:
virtual ~base();
C 之建構函式與析構函式
最近在學習c 每次看到繼承這段的時候,總是一邊感慨這門語言的難度,一邊感慨這門語言的神奇之處。最近看到了建構函式這段,問了自己這樣乙個問題,建構函式可以是虛函式嗎?不是很清楚,於是去查了一些資料。首先我覺得應該明確的乙個問題就是,虛函式的功能是c 中多型的一種實現方式。主要是繼承類的某些功能和基類的...
c 之建構函式與析構函式
建構函式 建構函式的原型和函式頭有乙個特徵 雖然沒有返回值,但沒有被宣告為void,實際上建構函式不允許宣告型別的。例子 stock stock const char co,int n,doublem 當建立物件初始化賦值有兩種方式 1.stock food stock adsfdsa 1,5.0 ...
C 之建構函式與析構函式
c 中重要的是類的構造,對乙個事物抽象,得到其本質的東西 所謂本質,放之四海而皆準 類也無非對一些資料與函式的封裝。對於類中的建構函式 析構函式有其固有的特點。故總結如下 建構函式和析構函式是在類體中說明的兩種特殊的成員函式。建構函式是在建立物件時,使用給定的值來將物件初始化。析構函式的功能正好相反...