1.為什麼有時要把析構函式變為虛函式
答: 這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。
當然,並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式。
2.為什麼建構函式不能是虛函式
答:(1)
虛函式的執行依賴於虛函式表。而虛函式表在建構函式中進行初始化工作,即初始化vptr,讓他指向正確的虛函式表。而在構造物件期間,虛函式表還沒有被初始化,將無法進行,故建構函式不能是虛函式
3.虛指標和虛函式表分別儲存在哪個區域
答:虛指標是屬於物件的,在物件的記憶體空間中,一般是物件的前4個位元組
虛函式表是屬於整個類的,其儲存位置跟編譯器有關,微軟編譯器的儲存位置為常量段,linux下的編譯器在唯讀資料段。
建構函式 析構函式 虛析構函式
說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...
C 建構函式 析構函式 虛析構函式
一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...
構造析構中的虛函式
今天花了好長時間在專案中找到乙個記憶體洩漏的bug,其根本原因是設計思想在作怪。犯了c 之兵家大忌,在析構中呼叫 了虛函式。拿出來和大家分享一下 假設我們有這樣的乙個設計 class itemcontainbase 存放元素的容器 itemcontainbase itemcontainbase vo...