建構函式,析構函式,虛函式等易錯混淆點

2021-07-31 13:45:58 字數 942 閱讀 5781

1.建構函式是否可以是虛函式?析構函式呢?

答:建構函式不可以,虛函式是借助於虛函式表,而且是通過虛函式指標找到虛函式表,然而虛函式指標存在於物件之中,要有個物件才行,而呼叫建構函式的時候物件還沒有建立,沒有建立怎麼會有虛函式指標呢?所以不可以。

析構函式可以當乙個父類的析構函式被宣告為虛函式的時候,我們delete乙個指向子類物件的父類指標的時候,實際呼叫的是子類的析構函式,但是子類析構函式會自動引發父類的析構函式的呼叫,從而使子類特有的部分和從父類繼承的部分能夠釋放,我們一般把父類的析構函式宣告成虛函式,儘管這個析構函式什麼都不做。(最好是把基類的析構函式定義為虛函式,否則當用基類去建立乙個指向派生類的指標,當其釋放的時候基類中的東西可能不會被釋放,造成記憶體洩漏)

2..虛函式是否可以是內聯函式?

答:不可以,虛函式是通過虛函式表,這是在執行的時候確定的,然而內聯函式的替換是在編譯階段,編譯的時候不知道呼叫哪乙個虛函式所以不可以。(編譯時靜態的,執行是動態的)

3.靜態成員函式是否可以是虛函式?

答:不可以,靜態成員函式不屬於哪個類,而虛函式通過虛函式指標找到虛函式表,虛函式依賴於物件指標,而靜態函式不屬於某各類,所以不可以。

4.虛函式表和虛函式指標在執行,編譯時建立?

虛函式指標是在執行時建立的,他也是類的隱藏的成員,他在呼叫建構函式的時候執行,建構函式執行完以後虛函式指標初始化好(建構函式在執行時呼叫的)

5.什麼是虛函式?純虛函式?什麼是抽象類?純抽象類?

答:虛函式:被virtual修飾的成員函式。(建構函式,靜態成員函式和全域性函式不能被宣告為虛函式)

純虛函式:virtual  函式返回值 函式名()

= 0

抽象類:有純虛函式的類是抽象類。(不能建立抽象類的物件,當做乙個介面類使用)

純抽象類:除了建構函式與靜態成員函式意外都是純虛函式的類。

6.析構函式是否可以過載?

答:不可以,因為它沒有引數。

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

建構函式 析構函式 虛函式

在類中,建構函式用於初始化物件及相關操作。建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table 虛函式表 這個表的位址是儲存在物件的記憶體空間的。而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。析構...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...