1樓:匿名使用者
呵呵,這個問題其實不應該那麼直接去理解,有幾層含義:
1 如果某類a析構函式沒有設定為虛函式。
2 並且類a做基類,被類b繼承。
滿足上面兩個條件,有如下結果:
多型時,按照父類指標delete子類b類物件,那麼類b的物件生命週期結束,類a的析構會被呼叫,但該類子類b類的析構函式不會被呼叫。
會造成的影響:
a)如果類b的析構函式沒有任何操作,沒有任何影響,不會有錯誤。
b)如果類b的析構函式有相關操作,那麼這些操作將得不到正確的呼叫。
在b的情況下,如果涉及記憶體釋放,那麼記憶體得不到釋放,就會有記憶體洩漏。
總結:如果乙個類可能被作為基類,一般都建議將析構函式定義為virtual。
2樓:匿名使用者
應該這樣說
b : public a
如果a* p = new b
delete p;
這個時候 如果析構函式不是virtual的 那麼 b的析構函式就不會被執行,這樣有可能造成記憶體洩漏
另外 問題只會在這樣的情況下發生 所以只有有這樣操作的物件的類 需要將析構函式定義成虛析構函式
對於 一般把析構函式都定義成虛析構函式,注意 如果定義虛函式,那麼類物件就需要額外儲存
乙個虛表指標,也就是 有虛函式的類的物件會額外多出乙個指標空間的資料,
所以對於那些嚴格要求位元組對齊的型別來說,不適合使用虛函式來處理,另外虛函式會增加呼叫查詢虛表的開銷,所以從這兩個角度來說 除了必要的時候 不應該一般把析構函式定義為虛析構函式
3樓:孤星淚
不會。第一,有乙個預設的析構函式。如果你在析構函式中沒有釋放其它在堆上分配記憶體,其實沒有必要。對會一層層的呼叫析構函式。
關於c++ 類繼承中的虛析構函式
4樓:匿名使用者
你第乙個問題的理解是錯的,其實只要子類的析構函式是虛函式,子類和基類的析構函式是構成覆蓋關係的,因為儘管他們函式名不一樣,但因為每個類只有乙個析構函式,所以c++規定他們是構成覆蓋關係的,所以兩全其美的方法就是基類的析構函式都定義為虛函式
5樓:匿名使用者
派生類的析構函式自動呼叫基類的析構函式,不需要使用者操心
換句話說,你想多了。
c++中的虛析構函式的作用是什麼
6樓:淇水湯湯
什麼時候要用虛析構函式?
通過基類的指標來刪除派生類的物件時,基類的析構函式應該是虛的。否則其刪除效果將無法實現。
一般情況下,這樣的刪除只能夠刪除基類物件,而不能刪除子類物件,形成了刪除一半角象,從而千萬記憶體洩漏。
原因:(.....)
去我給的參考位址**看下,那有詳細介紹。
c++中虛析構函式有什麼用啊?
7樓:
虛析構函式是為了解決,派生類析構時,析構基類的一種機制
8樓:匿名使用者
析構函式只有乙個,例如
class a
}class b:public a
}b cb;
a* pa =(a*)&cb
當delete pa的時候如果不是虛函式的話,析構就會有問題
9樓:
虛析構函式是為了解決這樣的乙個問題:基類的指標指向派生類物件,並用基類的指標刪除派生類物件。
裡面有詳細說明!
10樓:匿名使用者
可以在派生類中重定義析構函式
關於c 中析構函式析構順序問題
c 程式設計屬於邏輯思維,在設定乙個函式和數值中來回迴圈所得出的結論 無論是c語言還是c 語言,都是沒太大的順序。比如開始的c語言輸出 include vrio main 這是簡單的輸出,標頭檔案和輸出函式 輸出語句。只要一步步來,無論什麼都不會錯的。不過在c 語言裡面不能出現小錯誤,乙個小錯誤會影...
c 中的析構函式與建構函式的區別
c 中的析構函式與建構函式的區別主要是功能上的區別 建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。析構函式 dest...
c的類中在建構函式中呼叫析構函式會發生什麼
就跟呼叫成員函式一樣,在語法上是可行的 但是由於析構函式的功能,在語義上可能會有無法預料的結果因為在物件銷毀時會隱式呼叫一次,可能會出問題同時考慮這個 偽 class a a 這個屬於合法不合理的事,除非你析構設計的就是想隨時呼叫都沒事。 無論是在基類還是在子類,類的析構函式都是不允許被顯式呼叫的,...