1樓:育知同創教育
c++中 析構
函式中不可以呼叫虛擬函式。
effective c++ 中有這樣的描述:同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c++ 就將它們視為不再存在。
c++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的解構函式再呼叫基類的建構函式。
假設一個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了一個虛擬函式,這個時候有兩種選擇:plan a是編譯器呼叫這個虛擬函式的基類版本,那麼虛擬函式則失去了執行時呼叫正確版本的意義;plan b是編譯器呼叫這個虛擬函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。
2樓:回頭的世界
很簡單,你定義一個虛擬函式,然後在解構函式中呼叫看看,debug除錯,能執行就證明可以!
自己動手比實踐,比問別人「記住」一些規則,更有效果!
3樓:徐霄沛
是可以的,不過,這樣呼叫沒有什麼意義,不能實現多型。
建構函式的呼叫順序,建構函式和解構函式呼叫的順序
構造 塊的作用同樣是給物件進行初始化。物件一建立就執行構造 塊了,而且優先於建構函式執行。這裡要強調一下,有物件建立,才會執行構造 塊,類不能呼叫構造 塊的,而且構造 塊與建構函式的執行順序是前者先於後者執行。構造 塊與建構函式的區別是 構造 塊是給所有物件進行統一初始化,而建構函式是給對應的物件初...
C中如何呼叫靜態類中的建構函式
靜態建構函式既沒有訪問修飾符,也沒有引數。如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態欄位,那麼編譯器會自動生成預設的靜態建構函式。在建立第一個類例項或任何靜態成員被引用時,net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構...
c 中基類指標指向派生類時,呼叫的虛擬函式是派生類的,為什麼要這樣啊
直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area 用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類...