為什麼不能在析構函式中呼叫虛函式?

時間 2021-05-31 08:23:29

1樓:CHAN.K

析構函式中呼叫虛函式不會呈現出多型!因為,,,當你呼叫某個繼承層次中的析構函式的時候,編譯系統會預設從該層開始,往後的派生類已經都被析構了,所以 ,,,也就不能出現多型的情況了...當然,,這麼寫編譯器也不會報錯

2樓:唐沂

Effective C++條款9講建構函式中不要呼叫虛函式已經很清楚了,析構函式與其類似

我猜你的疑惑在於不了解基類與派生類析構函式的執行順序,C++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的析構函式再呼叫基類的建構函式。

假設乙個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了乙個虛函式,這個時候有兩種選擇:Plan A是編譯器呼叫這個虛函式的基類版本,那麼虛函式則失去了執行時呼叫正確版本的意義;Plan B是編譯器呼叫這個虛函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。

實際情況中編譯器使用的是Plan A,如果虛函式的基類版本不是純虛實現,不會有嚴重錯誤發生,但你依然會困惑虛函式機制失效,說不准又是「一張通往徹夜除錯的直達車票」,所以Effective C++建議不要這麼幹

3樓:啐樓

這只是表象,實質是,當你析構的時候不要去訪問不確定的成員資料,析構的時候只應該work on析構的事務上,做其他事情都有風險,而且是不make sense的

c 靜態成員函式為什麼不能為虛函式?

Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...

python呼叫類函式為什麼不能一步呼叫?

王加加 因為你定義的是物件的函式而不是類的函式。預設定義的是物件的函式,必須例項化後才能使用。這也是為什麼函式第乙個引數要傳入self,因為self是類例項化後得到的指向自己變數 類似於C 中的this指標 如果不是例項化的物件,函式就沒法得到self引數。要想直接呼叫,有三種方法。一種方法,呼叫的...

為什麼不能在訊號處理的時候使用系統呼叫

尾翼 系統的慢系統呼叫會被訊號打斷,而不是所有的系統呼叫都會被訊號打斷。慢系統呼叫來描述那些可能永遠堵塞的系統呼叫,如 accept,read,等。當慢系統呼叫接收到訊號的時候,系統呼叫可能返回乙個EINTR錯誤,多程序的伺服器中,為了避免accept被子程序訊號打斷,需要自己在accept返回 1...